Skip to content

Commit

Permalink
Use BSP v1.3 for RZ/G2L
Browse files Browse the repository at this point in the history
Signed-off-by: Ayman Chaudhry <[email protected]>
  • Loading branch information
Ayman Chaudhry committed Nov 5, 2021
1 parent c84d245 commit 9d4c3c0
Show file tree
Hide file tree
Showing 16 changed files with 159 additions and 36 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ tag: BSP-1.0.8 (b11b9471c31d8231a43c7eeeed8702e9873841ae)
#### For RZ/G2L ####
The layers should be used with the official Renesas RZ/G2L Yocto Poky BSP:
URI: **https://github.com/renesas-rz/meta-rzg2/tree/dunfell/rzg2l**
tag: rzg2l_bsp_v1.1-update1 (61f6dcb61ac89b92c93a9d8627b837f59cf307d6)
tag: rzg2l_bsp_v1.3 (f3cc7301380d320f18b9113ec75f960d5007eb43)

For each AI tool, please refer to **meta-${AI\_TOOL\_NAME}/README.md**. For
example:
Expand Down
2 changes: 2 additions & 0 deletions meta-armnn/templates/smarc-rzg2l/bblayers.conf
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ BBPATH = "${TOPDIR}"
BBFILES ?= ""

QT_LAYER = "${@os.path.isdir("${TOPDIR}/../meta-qt5")}"
RZ_FEATURE = "${@os.path.isdir("${TOPDIR}/../meta-rz-features")}"

BBLAYERS ?= " \
${TOPDIR}/../meta-gplv2 \
Expand All @@ -17,6 +18,7 @@ BBLAYERS ?= " \
${TOPDIR}/../meta-openembedded/meta-python \
${TOPDIR}/../meta-openembedded/meta-multimedia \
${@'${TOPDIR}/../meta-qt5' if '${QT_LAYER}' == 'True' else ''} \
${@'${TOPDIR}/../meta-rz-features' if '${RZ_FEATURE}' == 'True' else ''} \
${TOPDIR}/../meta-renesas-ai/meta-rzg-ai \
${TOPDIR}/../meta-renesas-ai/meta-armnn \
${TOPDIR}/../meta-renesas-ai/meta-tensorflow-lite \
Expand Down
7 changes: 2 additions & 5 deletions meta-armnn/templates/smarc-rzg2l/local.conf
Original file line number Diff line number Diff line change
Expand Up @@ -298,11 +298,8 @@ INCOMPATIBLE_LICENSE = "GPLv3 GPLv3+"
# Enable multilib to support 32-bits applications.
require conf/multilib.conf
MULTILIBS = "multilib:lib32"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon"
IMAGE_INSTALL_append = " lib32-htop"

# Mask core-image-qt.bbappend when not building with Qt
BBMASK_non_debian += "${@'core-image-qt*' if 'qt5-layer' not in BBFILE_COLLECTIONS.split() else ''}"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon-vfpv4"
USE_32BIT_PKGS = "1"

# Enable ArmNN
IMAGE_INSTALL_append = " armnn-dev armnn-examples \
Expand Down
2 changes: 2 additions & 0 deletions meta-benchmark/templates/armnn+tfl/smarc-rzg2l/bblayers.conf
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ BBPATH = "${TOPDIR}"
BBFILES ?= ""

QT_LAYER = "${@os.path.isdir("${TOPDIR}/../meta-qt5")}"
RZ_FEATURE = "${@os.path.isdir("${TOPDIR}/../meta-rz-features")}"

BBLAYERS ?= " \
${TOPDIR}/../meta-gplv2 \
Expand All @@ -17,6 +18,7 @@ BBLAYERS ?= " \
${TOPDIR}/../meta-openembedded/meta-python \
${TOPDIR}/../meta-openembedded/meta-multimedia \
${@'${TOPDIR}/../meta-qt5' if '${QT_LAYER}' == 'True' else ''} \
${@'${TOPDIR}/../meta-rz-features' if '${RZ_FEATURE}' == 'True' else ''} \
${TOPDIR}/../meta-renesas-ai/meta-rzg-ai \
${TOPDIR}/../meta-renesas-ai/meta-benchmark \
${TOPDIR}/../meta-renesas-ai/meta-armnn \
Expand Down
7 changes: 2 additions & 5 deletions meta-benchmark/templates/armnn+tfl/smarc-rzg2l/local.conf
Original file line number Diff line number Diff line change
Expand Up @@ -298,11 +298,8 @@ INCOMPATIBLE_LICENSE = "GPLv3 GPLv3+"
# Enable multilib to support 32-bits applications.
require conf/multilib.conf
MULTILIBS = "multilib:lib32"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon"
IMAGE_INSTALL_append = " lib32-htop"

# Mask core-image-qt.bbappend when not building with Qt
BBMASK_non_debian += "${@'core-image-qt*' if 'qt5-layer' not in BBFILE_COLLECTIONS.split() else ''}"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon-vfpv4"
USE_32BIT_PKGS = "1"

# Enable ArmNN
IMAGE_INSTALL_append = " armnn-dev armnn-examples \
Expand Down
2 changes: 2 additions & 0 deletions meta-benchmark/templates/onnx/smarc-rzg2l/bblayers.conf
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ BBPATH = "${TOPDIR}"
BBFILES ?= ""

QT_LAYER = "${@os.path.isdir("${TOPDIR}/../meta-qt5")}"
RZ_FEATURE = "${@os.path.isdir("${TOPDIR}/../meta-rz-features")}"

BBLAYERS ?= " \
${TOPDIR}/../meta-gplv2 \
Expand All @@ -17,6 +18,7 @@ BBLAYERS ?= " \
${TOPDIR}/../meta-openembedded/meta-python \
${TOPDIR}/../meta-openembedded/meta-multimedia \
${@'${TOPDIR}/../meta-qt5' if '${QT_LAYER}' == 'True' else ''} \
${@'${TOPDIR}/../meta-rz-features' if '${RZ_FEATURE}' == 'True' else ''} \
${TOPDIR}/../meta-renesas-ai/meta-rzg-ai \
${TOPDIR}/../meta-renesas-ai/meta-benchmark \
${TOPDIR}/../meta-renesas-ai/meta-onnxruntime \
Expand Down
7 changes: 2 additions & 5 deletions meta-benchmark/templates/onnx/smarc-rzg2l/local.conf
Original file line number Diff line number Diff line change
Expand Up @@ -298,11 +298,8 @@ INCOMPATIBLE_LICENSE = "GPLv3 GPLv3+"
# Enable multilib to support 32-bits applications.
require conf/multilib.conf
MULTILIBS = "multilib:lib32"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon"
IMAGE_INSTALL_append = " lib32-htop"

# Mask core-image-qt.bbappend when not building with Qt
BBMASK_non_debian += "${@'core-image-qt*' if 'qt5-layer' not in BBFILE_COLLECTIONS.split() else ''}"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon-vfpv4"
USE_32BIT_PKGS = "1"

# Enable ONNX Runtime
IMAGE_INSTALL_append = " onnxruntime-staticdev onnxruntime-dev onnxruntime-examples"
Expand Down
2 changes: 2 additions & 0 deletions meta-benchmark/templates/tflite/smarc-rzg2l/bblayers.conf
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ BBPATH = "${TOPDIR}"
BBFILES ?= ""

QT_LAYER = "${@os.path.isdir("${TOPDIR}/../meta-qt5")}"
RZ_FEATURE = "${@os.path.isdir("${TOPDIR}/../meta-rz-features")}"

BBLAYERS ?= " \
${TOPDIR}/../meta-gplv2 \
Expand All @@ -17,6 +18,7 @@ BBLAYERS ?= " \
${TOPDIR}/../meta-openembedded/meta-python \
${TOPDIR}/../meta-openembedded/meta-multimedia \
${@'${TOPDIR}/../meta-qt5' if '${QT_LAYER}' == 'True' else ''} \
${@'${TOPDIR}/../meta-rz-features' if '${RZ_FEATURE}' == 'True' else ''} \
${TOPDIR}/../meta-renesas-ai/meta-rzg-ai \
${TOPDIR}/../meta-renesas-ai/meta-benchmark \
${TOPDIR}/../meta-renesas-ai/meta-tensorflow-lite \
Expand Down
7 changes: 2 additions & 5 deletions meta-benchmark/templates/tflite/smarc-rzg2l/local.conf
Original file line number Diff line number Diff line change
Expand Up @@ -298,11 +298,8 @@ INCOMPATIBLE_LICENSE = "GPLv3 GPLv3+"
# Enable multilib to support 32-bits applications.
require conf/multilib.conf
MULTILIBS = "multilib:lib32"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon"
IMAGE_INSTALL_append = " lib32-htop"

# Mask core-image-qt.bbappend when not building with Qt
BBMASK_non_debian += "${@'core-image-qt*' if 'qt5-layer' not in BBFILE_COLLECTIONS.split() else ''}"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon-vfpv4"
USE_32BIT_PKGS = "1"

# Enable Tensorflow-lite
IMAGE_INSTALL_append = " tensorflow-lite-staticdev tensorflow-lite-dev tensorflow-lite-examples"
Expand Down
2 changes: 2 additions & 0 deletions meta-onnxruntime/templates/smarc-rzg2l/bblayers.conf
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ BBPATH = "${TOPDIR}"
BBFILES ?= ""

QT_LAYER = "${@os.path.isdir("${TOPDIR}/../meta-qt5")}"
RZ_FEATURE = "${@os.path.isdir("${TOPDIR}/../meta-rz-features")}"

BBLAYERS ?= " \
${TOPDIR}/../meta-gplv2 \
Expand All @@ -17,6 +18,7 @@ BBLAYERS ?= " \
${TOPDIR}/../meta-openembedded/meta-python \
${TOPDIR}/../meta-openembedded/meta-multimedia \
${@'${TOPDIR}/../meta-qt5' if '${QT_LAYER}' == 'True' else ''} \
${@'${TOPDIR}/../meta-rz-features' if '${RZ_FEATURE}' == 'True' else ''} \
${TOPDIR}/../meta-renesas-ai/meta-rzg-ai \
${TOPDIR}/../meta-renesas-ai/meta-onnxruntime \
"
7 changes: 2 additions & 5 deletions meta-onnxruntime/templates/smarc-rzg2l/local.conf
Original file line number Diff line number Diff line change
Expand Up @@ -298,10 +298,7 @@ INCOMPATIBLE_LICENSE = "GPLv3 GPLv3+"
# Enable multilib to support 32-bits applications.
require conf/multilib.conf
MULTILIBS = "multilib:lib32"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon"
IMAGE_INSTALL_append = " lib32-htop"

# Mask core-image-qt.bbappend when not building with Qt
BBMASK_non_debian += "${@'core-image-qt*' if 'qt5-layer' not in BBFILE_COLLECTIONS.split() else ''}"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon-vfpv4"
USE_32BIT_PKGS = "1"

IMAGE_INSTALL_append = " onnxruntime-staticdev onnxruntime-dev"
2 changes: 2 additions & 0 deletions meta-tensorflow-lite/templates/smarc-rzg2l/bblayers.conf
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ BBPATH = "${TOPDIR}"
BBFILES ?= ""

QT_LAYER = "${@os.path.isdir("${TOPDIR}/../meta-qt5")}"
RZ_FEATURE = "${@os.path.isdir("${TOPDIR}/../meta-rz-features")}"

BBLAYERS ?= " \
${TOPDIR}/../meta-gplv2 \
Expand All @@ -17,6 +18,7 @@ BBLAYERS ?= " \
${TOPDIR}/../meta-openembedded/meta-python \
${TOPDIR}/../meta-openembedded/meta-multimedia \
${@'${TOPDIR}/../meta-qt5' if '${QT_LAYER}' == 'True' else ''} \
${@'${TOPDIR}/../meta-rz-features' if '${RZ_FEATURE}' == 'True' else ''} \
${TOPDIR}/../meta-renesas-ai/meta-rzg-ai \
${TOPDIR}/../meta-renesas-ai/meta-tensorflow-lite \
"
7 changes: 2 additions & 5 deletions meta-tensorflow-lite/templates/smarc-rzg2l/local.conf
Original file line number Diff line number Diff line change
Expand Up @@ -298,11 +298,8 @@ INCOMPATIBLE_LICENSE = "GPLv3 GPLv3+"
# Enable multilib to support 32-bits applications.
require conf/multilib.conf
MULTILIBS = "multilib:lib32"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon"
IMAGE_INSTALL_append = " lib32-htop"

# Mask core-image-qt.bbappend when not building with Qt
BBMASK_non_debian += "${@'core-image-qt*' if 'qt5-layer' not in BBFILE_COLLECTIONS.split() else ''}"
DEFAULTTUNE_virtclass-multilib-lib32 = "armv7vethf-neon-vfpv4"
USE_32BIT_PKGS = "1"

# Enable Tensorflow-lite
IMAGE_INSTALL_append = " tensorflow-lite-staticdev tensorflow-lite-dev tensorflow-lite-examples"
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
From 72741aae81f7b6a06cc1e6a841fcd9eb009339d9 Mon Sep 17 00:00:00 2001
From: Gareth Williams <[email protected]>
Date: Tue, 2 Nov 2021 15:26:59 +0000
Subject: [PATCH] Enable RZ/G2L Qt SDK builds

Signed-off-by: Gareth Williams <[email protected]>
---
.../qt5-layer/images/core-image-qt-sdk.bb | 30 ++++++++++++++++++++++
1 file changed, 30 insertions(+)
create mode 100644 dynamic-layers/qt5-layer/images/core-image-qt-sdk.bb

diff --git a/dynamic-layers/qt5-layer/images/core-image-qt-sdk.bb b/dynamic-layers/qt5-layer/images/core-image-qt-sdk.bb
new file mode 100644
index 0000000..706e3a8
--- /dev/null
+++ b/dynamic-layers/qt5-layer/images/core-image-qt-sdk.bb
@@ -0,0 +1,30 @@
+include core-image-qt.bb
+inherit populate_sdk_qt5_base
+
+### For cross-compile Qt ###
+TOOLCHAIN_HOST_TASK_append = ' nativesdk-qtbase-tools '
+
+# Create pri file to prevent below warning when running qmake
+# "...usr/lib/qt5/mkspecs/oe-device-extra.pri: No such file or directory"
+fakeroot append_qt () {
+ # Generate oe-device-extra.pri
+ if [ -d ${SDK_OUTPUT}/${SDKPATH}/sysroots/${TARGET_SYS}/${libdir}/${QT_DIR_NAME}/mkspecs ] &&
+ [ ! -f ${SDK_OUTPUT}/${SDKPATH}/sysroots/${TARGET_SYS}/${libdir}/${QT_DIR_NAME}/mkspecs/oe-device-extra.pri ]
+ then
+ touch ${SDK_OUTPUT}/${SDKPATH}/sysroots/${TARGET_SYS}/${libdir}/${QT_DIR_NAME}/mkspecs/oe-device-extra.pri
+ fi
+}
+SDK_POSTPROCESS_COMMAND_prepend = " append_qt;"
+
+
+### For self-compile Qt ###
+IMAGE_INSTALL_append = ' packagegroup-qt5-toolchain-target '
+
+setup_qt_env () {
+ if [ ! -e ${IMAGE_ROOTFS}/${sysconfdir}/profile.d/setup_qt_env ]
+ then
+ echo 'export PATH=$PATH:/usr/bin/qt5' > ${IMAGE_ROOTFS}${sysconfdir}/profile.d/setup_qt_env
+ echo 'export INCLUDEPATH=$INCLUDEPATH:/usr/include/qt5' >> ${IMAGE_ROOTFS}${sysconfdir}/profile.d/setup_qt_env
+ fi
+}
+ROOTFS_POSTPROCESS_COMMAND += 'setup_qt_env;'
--
2.7.4

Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
From 8c70fb75b8225ea5ee9ecdf99914d4864abde6fe Mon Sep 17 00:00:00 2001
From: Nhan Nguyen <[email protected]>
Date: Tue, 12 Oct 2021 16:17:49 +0700
Subject: [PATCH] firmware-pack: fix tf-a binary file not found

Signed-off-by: Nhan Nguyen <[email protected]>
---
recipes-bsp/firmware-pack/firmware-pack.bb | 12 ++++++------
.../trusted-firmware-a/trusted-firmware-a.inc | 14 ++++++++++++++
2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/recipes-bsp/firmware-pack/firmware-pack.bb b/recipes-bsp/firmware-pack/firmware-pack.bb
index 6a8848ac..86666fbb 100644
--- a/recipes-bsp/firmware-pack/firmware-pack.bb
+++ b/recipes-bsp/firmware-pack/firmware-pack.bb
@@ -15,20 +15,20 @@ do_configure[noexec] = "1"
do_compile () {

# Create bl2_bp.bin
- bootparameter ${DEPLOY_DIR_IMAGE}/bl2-${MACHINE}.bin bl2_bp.bin
- cat ${DEPLOY_DIR_IMAGE}/bl2-${MACHINE}.bin >> bl2_bp.bin
+ bootparameter ${WORKDIR}/recipe-sysroot/boot/bl2-${MACHINE}.bin bl2_bp.bin
+ cat ${WORKDIR}/recipe-sysroot/boot/bl2-${MACHINE}.bin >> bl2_bp.bin

# Create fip.bin
- fiptool create --align 16 --soc-fw ${DEPLOY_DIR_IMAGE}/bl31-${MACHINE}.bin --nt-fw ${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.bin fip.bin
+ fiptool create --align 16 --soc-fw ${WORKDIR}/recipe-sysroot/boot/bl31-${MACHINE}.bin --nt-fw ${WORKDIR}/recipe-sysroot/boot/u-boot.bin fip.bin

# Convert to srec
objcopy -O srec --adjust-vma=0x00011E00 --srec-forceS3 -I binary bl2_bp.bin bl2_bp.srec
objcopy -I binary -O srec --adjust-vma=0x0000 --srec-forceS3 fip.bin fip.srec

if [ "${PMIC_SUPPORT}" = "1" ]; then
- bootparameter ${DEPLOY_DIR_IMAGE}/bl2-${MACHINE}_pmic.bin bl2_bp_pmic.bin
- cat ${DEPLOY_DIR_IMAGE}/bl2-${MACHINE}_pmic.bin >> bl2_bp_pmic.bin
- fiptool create --align 16 --soc-fw ${DEPLOY_DIR_IMAGE}/bl31-${MACHINE}_pmic.bin --nt-fw ${DEPLOY_DIR_IMAGE}/u-boot-${MACHINE}.bin fip_pmic.bin
+ bootparameter ${WORKDIR}/recipe-sysroot/boot/bl2-${MACHINE}_pmic.bin bl2_bp_pmic.bin
+ cat ${WORKDIR}/recipe-sysroot/boot/bl2-${MACHINE}_pmic.bin >> bl2_bp_pmic.bin
+ fiptool create --align 16 --soc-fw ${WORKDIR}/recipe-sysroot/boot/bl31-${MACHINE}_pmic.bin --nt-fw ${WORKDIR}/recipe-sysroot/boot/u-boot.bin fip_pmic.bin
objcopy -O srec --adjust-vma=0x00011E00 --srec-forceS3 -I binary bl2_bp_pmic.bin bl2_bp_pmic.srec
objcopy -I binary -O srec --adjust-vma=0x0000 --srec-forceS3 fip_pmic.bin fip_pmic.srec
fi
diff --git a/recipes-bsp/trusted-firmware-a/trusted-firmware-a.inc b/recipes-bsp/trusted-firmware-a/trusted-firmware-a.inc
index b7a4f35a..afcc6c33 100644
--- a/recipes-bsp/trusted-firmware-a/trusted-firmware-a.inc
+++ b/recipes-bsp/trusted-firmware-a/trusted-firmware-a.inc
@@ -48,6 +48,9 @@ LD[unexport] = "1"
# No configure
do_configure[noexec] = "1"

+FILES_${PN} = "/boot "
+SYSROOT_DIRS += "/boot"
+
do_compile () {
# Build TF-A
oe_runmake PLAT=${PLATFORM} ${EXTRA_FLAGS} bl2 bl31
@@ -57,6 +60,17 @@ do_compile () {
fi
}

+do_install () {
+ install -d ${D}/boot
+ install -m 644 ${S}/build/${PLATFORM}/release/bl2.bin ${D}/boot/bl2-${MACHINE}.bin
+ install -m 644 ${S}/build/${PLATFORM}/release/bl31.bin ${D}/boot/bl31-${MACHINE}.bin
+
+ if [ "${PMIC_SUPPORT}" = "1" ]; then
+ install -m 0644 ${PMIC_BUILD_DIR}/bl2.bin ${D}/boot/bl2-${MACHINE}_pmic.bin
+ install -m 0644 ${PMIC_BUILD_DIR}/bl31.bin ${D}/boot/bl31-${MACHINE}_pmic.bin
+ fi
+}
+
do_deploy () {
# Create deploy folder
install -d ${DEPLOYDIR}
--
2.25.1

12 changes: 7 additions & 5 deletions scripts/build-rzg-ai-bsp.sh
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,8 @@ download_source () {
${RZG_AI_BSP_VER}

cd meta-rzg2; git am ../meta-renesas-ai/patches/meta-rzg2/dunfell-rzg2l/0001-cip-core.inc-Fix-recipes-debian-BBMASK.patch; cd -
cd meta-rzg2; git am ../meta-renesas-ai/patches/meta-rzg2/dunfell-rzg2l/0001-Enable-RZ-G2L-Qt-SDK-builds.patch; cd -
cd meta-rzg2; git am ../meta-renesas-ai/patches/meta-rzg2/dunfell-rzg2l/0001-firmware-pack-fix-tf-a-binary-file-not-found.patch; cd -
fi
}

Expand Down Expand Up @@ -333,10 +335,10 @@ install_prop_libs () {
popd
elif [ ${FAMILY} == "rzg2l" ]; then
pushd ${PROP_DIR}
unzip RTK0EF0045Z13001ZJ-*.zip
pushd RTK0EF0045Z13001ZJ-*/proprietary
./copy_gfx_mmp.sh ${WORK_DIR}/meta-rzg2
popd
unzip RTK0EF0045Z13001ZJ-v0.8_EN.zip
tar -xf RTK0EF0045Z13001ZJ-v0.8_EN/meta-rz-features.tar.gz -C ${WORK_DIR}
unzip RTK0EF0045Z15001ZJ-v0.51_EN.zip
tar -xf RTK0EF0045Z15001ZJ-v0.51_EN/meta-rz-features.tar.gz -C ${WORK_DIR}
popd
fi
}
Expand Down Expand Up @@ -423,7 +425,7 @@ case ${RZG_AI_BSP_VER} in
elif [ ${FAMILY} == "rzg2" ]; then
RZG_BSP_VER="BSP-1.0.8"
elif [ ${FAMILY} == "rzg2l" ]; then
RZG_BSP_VER="rzg2l_bsp_v1.1-update1"
RZG_BSP_VER="rzg2l_bsp_v1.3"
fi
;;
esac
Expand Down

0 comments on commit 9d4c3c0

Please sign in to comment.