summaryrefslogtreecommitdiff
path: root/meta-google
diff options
context:
space:
mode:
Diffstat (limited to 'meta-google')
-rw-r--r--meta-google/conf/distro/gbmc.conf2
-rw-r--r--meta-google/recipes-core/busybox/files/gbmc.cfg3
-rw-r--r--meta-google/recipes-extended/libconfig/conf2struct-native_git.bb4
-rw-r--r--meta-google/recipes-extended/networking/sslh_git.bb16
-rw-r--r--meta-google/recipes-google/google-misc/google-misc.inc2
-rw-r--r--meta-google/recipes-google/ipmi/google-ipmi-sys_git.bb2
-rw-r--r--meta-google/recipes-google/kcs/gbmc-kcs-config.bb46
-rw-r--r--meta-google/recipes-google/kcs/google-kcsbridge_git.bb16
-rw-r--r--meta-google/recipes-google/networking/google-usb-network/00-bmc-usb0.network.m47
-rw-r--r--meta-google/recipes-google/networking/google-usb-network/usb_network.service.m428
-rwxr-xr-xmeta-google/recipes-google/networking/google-usb-network/usb_network.sh165
-rwxr-xr-xmeta-google/recipes-google/networking/google-usb-network/usb_network_test.sh295
-rw-r--r--meta-google/recipes-google/networking/google-usb-network_git.bb64
-rw-r--r--meta-google/recipes-phosphor/flash/dummy-gbmc-update.bb23
-rw-r--r--meta-google/recipes-phosphor/flash/dummy-gbmc-update/config-dummy.json19
-rw-r--r--meta-google/recipes-phosphor/flash/dummy-gbmc-update/dummy-verify.service6
-rw-r--r--meta-google/recipes-phosphor/flash/google-key.bb26
-rw-r--r--meta-google/recipes-phosphor/flash/google-key/platforms_gbmc_bringup.gpgbin0 -> 552 bytes
-rw-r--r--meta-google/recipes-phosphor/flash/google-key/platforms_gbmc_secure.gpgbin0 -> 551 bytes
-rwxr-xr-xmeta-google/recipes-phosphor/flash/google-key/verify-bmc-image.sh63
-rw-r--r--meta-google/recipes-phosphor/flash/inplace-gbmc-update.bb44
-rw-r--r--meta-google/recipes-phosphor/flash/inplace-gbmc-update/config-bmc.json33
-rw-r--r--meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-verify.service6
-rw-r--r--meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-verify.sh57
-rw-r--r--meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-version.service9
-rw-r--r--meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-version.sh16
-rw-r--r--meta-google/recipes-phosphor/images/obmc-phosphor-image.bbappend12
-rw-r--r--meta-google/recipes-phosphor/ipmi/phosphor-ipmi-config.bbappend22
-rw-r--r--meta-google/recipes-phosphor/ipmi/phosphor-ipmi-config/gbmc_bridge.json11
-rw-r--r--meta-google/recipes-phosphor/settings/phosphor-settings-manager/timemanager-default-HOST-MANUAL.override.yml14
30 files changed, 938 insertions, 73 deletions
diff --git a/meta-google/conf/distro/gbmc.conf b/meta-google/conf/distro/gbmc.conf
index 354c93991..0aca6318c 100644
--- a/meta-google/conf/distro/gbmc.conf
+++ b/meta-google/conf/distro/gbmc.conf
@@ -16,3 +16,5 @@ DISTRO_FEATURES_append = " ipmi-fru"
WATCHDOG_PKG ?= "watchdog"
SANITY_TESTED_DISTROS_append = " Debian-rodete \n debian-rodete \n "
+
+PREFERRED_PROVIDER_virtual/bmc-update ?= "inplace-gbmc-update"
diff --git a/meta-google/recipes-core/busybox/files/gbmc.cfg b/meta-google/recipes-core/busybox/files/gbmc.cfg
index e097a921a..158f771b3 100644
--- a/meta-google/recipes-core/busybox/files/gbmc.cfg
+++ b/meta-google/recipes-core/busybox/files/gbmc.cfg
@@ -16,3 +16,6 @@ CONFIG_FEATURE_UDHCPC6_RFC3646=y
CONFIG_FEATURE_UDHCPC6_RFC4704=y
CONFIG_FEATURE_UDHCPC6_RFC4833=y
CONFIG_FEATURE_UDHCPC6_RFC5970=y
+
+# Misc
+CONFIG_BC=y
diff --git a/meta-google/recipes-extended/libconfig/conf2struct-native_git.bb b/meta-google/recipes-extended/libconfig/conf2struct-native_git.bb
index 1a77f4de1..ab5c3d829 100644
--- a/meta-google/recipes-extended/libconfig/conf2struct-native_git.bb
+++ b/meta-google/recipes-extended/libconfig/conf2struct-native_git.bb
@@ -1,9 +1,9 @@
LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://COPYING;md5=1b886630cdc9a17c26250934beda407d"
+LIC_FILES_CHKSUM = "file://COPYING;md5=667d4ad55f5fbf4c3e853e8acd0f74de"
PV = "0.1+git${SRCPV}"
SRC_URI = "git://github.com/yrutschle/conf2struct"
-SRCREV = "e8468017b27211b1c452f8df0afe6f19e97035a4"
+SRCREV = "6bc9eed1eb50175e5fda791f27d85e72f5a6ac78"
S = "${WORKDIR}/git"
SRC_URI += " \
diff --git a/meta-google/recipes-extended/networking/sslh_git.bb b/meta-google/recipes-extended/networking/sslh_git.bb
index b683571c1..ba26e2999 100644
--- a/meta-google/recipes-extended/networking/sslh_git.bb
+++ b/meta-google/recipes-extended/networking/sslh_git.bb
@@ -1,10 +1,10 @@
-PR = "r1"
+PR = "r2"
PV = "0.1+git${SRCPV}"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263"
SRC_URI = "git://github.com/yrutschle/sslh"
-SRCREV = "517e4ad5b4d57dae396790882bd4629947be1632"
+SRCREV = "63f9c4a582f79f4d0e484efe0ccaeed77a79f7df"
S = "${WORKDIR}/git"
inherit perlnative
@@ -14,7 +14,7 @@ DEPENDS += "libbsd"
DEPENDS += "libcap"
DEPENDS += "libconfig"
DEPENDS += "systemd"
-DEPENDS += "pcre"
+DEPENDS += "pcre2"
EXTRA_OEMAKE += "DESTDIR=${D}"
EXTRA_OEMAKE += "PREFIX=${prefix}"
@@ -22,10 +22,16 @@ EXTRA_OEMAKE += "USELIBCAP=1"
EXTRA_OEMAKE += "USELIBBSD=1"
EXTRA_OEMAKE += "USESYSTEMD=1"
+do_configure() {
+ oe_runmake distclean
+}
+
do_compile() {
- oe_runmake
+ # Workaround for the broken dependencies in the Makefile
+ oe_runmake sslh-conf.h
+ oe_runmake
}
do_install() {
- oe_runmake install
+ oe_runmake install
}
diff --git a/meta-google/recipes-google/google-misc/google-misc.inc b/meta-google/recipes-google/google-misc/google-misc.inc
index 20b4e0536..36ad141de 100644
--- a/meta-google/recipes-google/google-misc/google-misc.inc
+++ b/meta-google/recipes-google/google-misc/google-misc.inc
@@ -6,7 +6,7 @@ LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://../../LICENSE;md5=34400b68072d710fecd0a2940a0d1658"
SRC_URI += "git://github.com/openbmc/google-misc"
-SRCREV = "548f3ad151678fc3ee87b7bef25b6601611af978"
+SRCREV = "d237c6cc59e731c2a8a3a1bdcd91ad39bd67e182"
S = "${WORKDIR}/git/subprojects/${GOOGLE_MISC_PROJ}"
inherit meson
diff --git a/meta-google/recipes-google/ipmi/google-ipmi-sys_git.bb b/meta-google/recipes-google/ipmi/google-ipmi-sys_git.bb
index 6acf234cf..801de4361 100644
--- a/meta-google/recipes-google/ipmi/google-ipmi-sys_git.bb
+++ b/meta-google/recipes-google/ipmi/google-ipmi-sys_git.bb
@@ -19,7 +19,7 @@ DEPENDS += " \
S = "${WORKDIR}/git"
SRC_URI = "git://github.com/openbmc/google-ipmi-sys"
-SRCREV = "bc62b193aec2991397a7f671cd3a74492a961d5c"
+SRCREV = "b69209b498bf9b1c009c528e40280d13e68f8dbd"
FILES_${PN} += "${libdir}/ipmid-providers"
diff --git a/meta-google/recipes-google/kcs/gbmc-kcs-config.bb b/meta-google/recipes-google/kcs/gbmc-kcs-config.bb
deleted file mode 100644
index ca7110660..000000000
--- a/meta-google/recipes-google/kcs/gbmc-kcs-config.bb
+++ /dev/null
@@ -1,46 +0,0 @@
-SUMMARY = "Configures KCS for a gBMC system"
-PR = "r1"
-LICENSE = "Apache-2.0"
-LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
-
-inherit systemd
-
-S = "${WORKDIR}"
-
-PROVIDES += "virtual-obmc-host-ipmi-hw"
-RPROVIDES_${PN} += "virtual-obmc-host-ipmi-hw"
-
-FILES_${PN} += "${systemd_system_unitdir}"
-RDEPENDS_${PN} += "google-kcsbridge"
-
-GBMC_KCS_DEV ?= ""
-
-def systemd_escape_char(c):
- return '\\x{:x}'.format(ord(c))
-
-def systemd_escape(unit):
- import string
- ret = ''
- if len(unit) > 0 and unit[0] == '.':
- ret += systemd_escape_char(unit[0])
- unit = unit[1:]
- for c in unit:
- if c == '/':
- ret += '-'
- elif c not in {*string.ascii_letters, *string.digits, ':', '_', '.'}:
- ret += systemd_escape_char(c)
- else:
- ret += c
- return ret
-
-do_install_append() {
- if [ -z '${GBMC_KCS_DEV}' ]; then
- echo "Missing GBMC_KCS_DEV" >&2
- exit 1
- fi
-
- wantdir=${D}${systemd_system_unitdir}/multi-user.target.wants
- install -d -m0755 $wantdir
- inst="${@systemd_escape(GBMC_KCS_DEV)}"
- ln -sv ../kcsbridge@.service $wantdir/kcsbridge@$inst.service
-}
diff --git a/meta-google/recipes-google/kcs/google-kcsbridge_git.bb b/meta-google/recipes-google/kcs/google-kcsbridge_git.bb
deleted file mode 100644
index 4b3138eee..000000000
--- a/meta-google/recipes-google/kcs/google-kcsbridge_git.bb
+++ /dev/null
@@ -1,16 +0,0 @@
-SUMMARY = "Google NCSI daemon"
-DESCRIPTION = "Google NCSI daemon."
-GOOGLE_MISC_PROJ = "kcsbridge"
-
-require ../google-misc/google-misc.inc
-
-inherit systemd
-
-DEPENDS += " \
- fmt \
- sdbusplus \
- sdeventplus \
- stdplus \
-"
-
-SYSTEMD_SERVICE_${PN} += "kcsbridge@.service"
diff --git a/meta-google/recipes-google/networking/google-usb-network/00-bmc-usb0.network.m4 b/meta-google/recipes-google/networking/google-usb-network/00-bmc-usb0.network.m4
new file mode 100644
index 000000000..699ee8538
--- /dev/null
+++ b/meta-google/recipes-google/networking/google-usb-network/00-bmc-usb0.network.m4
@@ -0,0 +1,7 @@
+[Match]
+Name=usb0
+[Address]
+Address=M_BMC_IP_ADDR
+[Network]
+LinkLocalAddressing=ipv6
+IPv6AcceptRA=no
diff --git a/meta-google/recipes-google/networking/google-usb-network/usb_network.service.m4 b/meta-google/recipes-google/networking/google-usb-network/usb_network.service.m4
new file mode 100644
index 000000000..581c29b66
--- /dev/null
+++ b/meta-google/recipes-google/networking/google-usb-network/usb_network.service.m4
@@ -0,0 +1,28 @@
+divert(-1)
+define(`HOST_MAC_ARG', `ifelse($1, `invalid', `',
+ ifelse($1, `', `',
+ ` --host-mac "$1"'))')
+
+define(`DEV_MAC_ARG', `ifelse($1, `invalid', `',
+ ifelse($1, `', `',
+ ` --dev-mac "$1"'))')
+
+divert(0)dnl
+dnl
+[Unit]
+Description=USB ECM Gadget
+After=phosphor-ipmi-host.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=M_SCRIPT_INSTALL_DIR/usb_network.sh \
+ --product-id "M_BMC_USB_ECM_PRODUCT_ID" \
+ --product-name "M_BMC_USB_ECM_PRODUCT_NAME" \
+ HOST_MAC_ARG(M_BMC_USB_ECM_HOST_MAC) \
+ DEV_MAC_ARG(M_BMC_USB_ECM_DEV_MAC) \
+ --bind-device "M_BMC_USB_ECM_BIND_DEV"
+ExecStop=M_SCRIPT_INSTALL_DIR/usb_network.sh stop
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-google/recipes-google/networking/google-usb-network/usb_network.sh b/meta-google/recipes-google/networking/google-usb-network/usb_network.sh
new file mode 100755
index 000000000..08f9ad23b
--- /dev/null
+++ b/meta-google/recipes-google/networking/google-usb-network/usb_network.sh
@@ -0,0 +1,165 @@
+#!/bin/bash
+# Copyright 2021 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# List of options the script accepts. Trailing column means that the option
+# requires an argument.
+ARGUMENT_LIST=(
+ "help"
+ "product-id:"
+ "product-name:"
+ "host-mac:"
+ "bind-device:"
+ "dev-mac:"
+ "gadget-dir-name:"
+ "iface-name:"
+)
+
+print_usage() {
+ cat <<HELP
+$0 [OPTIONS] [stop|start]
+ Create USB Gadget Configuration
+ --product-id USB Product Id for the gadget.
+ --product-name Product name string (en) for the gadget.
+ --host-mac MAC address of the host part of the connection. Optional.
+ --dev-mac MAC address of the device (gadget) part of the connection. Optional.
+ --bind-device Name of the device to bind, as listed in /sys/class/udc/
+ --gadget-dir-name Optional base name for gadget directory. Default: "g1"
+ --iface-name Optional name of the network interface. Default: "usb0"
+ --help Print this help and exit.
+HELP
+}
+
+gadget_start() {
+ local gadget_dir="${CONFIGFS_HOME}/usb_gadget/${GADGET_DIR_NAME}"
+ mkdir -p "${gadget_dir}"
+ echo ${ID_VENDOR} > "${gadget_dir}/idVendor"
+ echo ${ID_PRODUCT} > "${gadget_dir}/idProduct"
+
+ local str_en_dir="${gadget_dir}/strings/0x409"
+ mkdir -p "${str_en_dir}"
+ echo ${STR_EN_VENDOR} > "${str_en_dir}/manufacturer"
+ echo ${STR_EN_PRODUCT} > "${str_en_dir}/product"
+
+ local config_dir="${gadget_dir}/configs/c.1"
+ mkdir -p "${config_dir}"
+ echo 100 > "${config_dir}/MaxPower"
+ mkdir -p "${config_dir}/strings/0x409"
+ echo "ECM" > "${config_dir}/strings/0x409/configuration"
+
+ local func_dir="${gadget_dir}/functions/ecm.${IFACE_NAME}"
+ mkdir -p "${func_dir}"
+
+ if [[ -n $HOST_MAC_ADDR ]]; then
+ echo ${HOST_MAC_ADDR} > ${func_dir}/host_addr
+ fi
+
+ if [[ -n $DEV_MAC_ADDR ]]; then
+ echo ${DEV_MAC_ADDR} > ${func_dir}/dev_addr
+ fi
+
+ ln -s "${func_dir}" "${config_dir}"
+
+ echo "${BIND_DEVICE}" > ${gadget_dir}/UDC
+}
+
+gadget_stop() {
+ local gadget_dir="${CONFIGFS_HOME}/usb_gadget/${GADGET_DIR_NAME}"
+ rm -f ${gadget_dir}/configs/c.1/ecm.${IFACE_NAME}
+ rm -rf ${gadget_dir}/configs/c.1/strings/0x409
+ rm -rf ${gadget_dir}/configs/c.1
+ rm -rf ${gadget_dir}/strings/0x409
+ rm -rf ${gadget_dir}/functions/ecm.${IFACE_NAME}
+ rm -rf ${gadget_dir}
+}
+
+opts=$(getopt \
+ --longoptions "$(printf "%s," "${ARGUMENT_LIST[@]}")" \
+ --name "$(basename "$0")" \
+ --options "" \
+ -- "$@"
+)
+
+eval set --$opts
+
+CONFIGFS_HOME=${CONFIGFS_HOME:-/sys/kernel/config}
+ID_VENDOR="0x18d1" # Google
+ID_PRODUCT=""
+STR_EN_VENDOR="Google"
+STR_EN_PRODUCT=""
+DEV_MAC_ADDR=""
+HOST_MAC_ADDR=""
+BIND_DEVICE=""
+ACTION="start"
+GADGET_DIR_NAME="g1"
+IFACE_NAME="usb0"
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --product-id)
+ ID_PRODUCT=$2
+ shift 2
+ ;;
+ --product-name)
+ STR_EN_PRODUCT=$2
+ shift 2
+ ;;
+ --host-mac)
+ HOST_MAC_ADDR=$2
+ shift 2
+ ;;
+ --dev-mac)
+ DEV_MAC_ADDR=$2
+ shift 2
+ ;;
+ --bind-device)
+ BIND_DEVICE=$2
+ shift 2
+ ;;
+ --gadget-dir-name)
+ GADGET_DIR_NAME=$2
+ shift 2
+ ;;
+ --iface-name)
+ IFACE_NAME=$2
+ shift 2
+ ;;
+ --help)
+ print_usage
+ exit 0
+ ;;
+ start)
+ ACTION="start"
+ shift 1
+ break
+ ;;
+ stop)
+ ACTION="stop"
+ shift 1
+ break
+ ;;
+ --)
+ shift 1
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+if [[ $ACTION == "stop" ]]; then
+ gadget_stop
+else
+ gadget_start
+fi
diff --git a/meta-google/recipes-google/networking/google-usb-network/usb_network_test.sh b/meta-google/recipes-google/networking/google-usb-network/usb_network_test.sh
new file mode 100755
index 000000000..e5894338b
--- /dev/null
+++ b/meta-google/recipes-google/networking/google-usb-network/usb_network_test.sh
@@ -0,0 +1,295 @@
+#!/bin/bash
+# Copyright 2021 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+TEMPDIRS=""
+TEMPFILES=""
+# Script under test
+SUT=$PWD/usb_network.sh
+
+TEST_STATUS="OK"
+
+test_setup() {
+ echo -n "Testing $1 ..."
+ FAKE_CONFIGFS=$(mktemp -d)
+ TEMPDIRS="${TEMPDIRS} ${FAKE_CONFIGFS}"
+ FAKE_GADGETFS=$FAKE_CONFIGFS/usb_gadget
+ mkdir -p "$FAKE_GADGETFS"
+}
+
+test_teardown() {
+ echo ${TEST_STATUS}
+ if test -n "$TEMPDIRS"; then
+ rm -rf ${TEMPDIRS}
+ fi
+ if test -n "$TEMPFILES"; then
+ rm -f $TEMPFILES
+ fi
+}
+
+test_fail() {
+ echo -n " $@ " >&2
+ TEST_STATUS="FAIL"
+
+ test_teardown
+ exit 1
+}
+
+check_file_content() {
+ local filename="$1"
+ local expected_content="$2"
+
+ if ! test -f "${filename}"; then
+ test_fail "File ${filename} does not exist!"
+ fi
+
+ local actual_content=$(cat ${filename})
+ if [[ $expected_content != $actual_content ]]; then
+ test_fail "Expected ${expected_content}, got ${actual_content}"
+ fi
+}
+
+test_gadget_creation_with_defaults() {
+ local extra_args=()
+ local gadget_dir="$1"
+ if [[ $gadget_dir == "" ]]; then
+ gadget_dir="g1";
+ else
+ extra_args=(${extra_args} --gadget-dir-name "${gadget_dir}")
+ fi
+ local product_name="Souvenier BMC"
+ local product_id="0xcafe"
+ local host_mac="ab:cd:ef:10:11:12"
+ local dev_mac="12:11:10:ef:cd:ab"
+ local bind_device="f80002000.udc"
+ CONFIGFS_HOME=${FAKE_CONFIGFS} ${SUT} --product-id "${product_id}" \
+ --product-name "${product_name}" \
+ --host-mac "${host_mac}" \
+ --dev-mac "${dev_mac}" \
+ --bind-device "${bind_device}" \
+ ${extra_args[@]}
+
+ if test $? -ne 0; then
+ test_fail "${SUT} failed"
+ fi
+
+ if ! test -d "${FAKE_GADGETFS}/${gadget_dir}"; then
+ test_fail "Gadget was not created!"
+ fi
+
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/idVendor "0x18d1"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/idProduct "${product_id}"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/manufacturer "Google"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/product "${product_name}"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/MaxPower "100"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/strings/0x409/configuration "ECM"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0/dev_addr "${dev_mac}"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0/host_addr "${host_mac}"
+
+ if ! test -d ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0; then
+ test_fail "Function directory was not created"
+ fi
+
+ local func_link="${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/ecm.usb0"
+ if ! test -L "${func_link}"; then
+ test_fail "Symlink to the function was not created in the config"
+ fi
+
+ local link_dest=$(realpath ${func_link})
+ if [[ $link_dest != ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0 ]]; then
+ test_fail "Symlink points to the wrong file/dir"
+ fi
+
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/UDC "${bind_device}"
+}
+
+test_gadget_creation_with_override() {
+ mkdir -p ${FAKE_GADGETFS}/g1/{strings,configs,functions}
+ touch ${FAKE_GADGETFS}/g1/{idVendor,idProduct}
+
+ test_gadget_creation_with_defaults
+}
+
+test_gadget_stopping() {
+ local extra_args=()
+ local gadget_dir="$1"
+ local iface_name="$2"
+ if [[ $gadget_dir == "" ]]; then
+ gadget_dir="g1";
+ else
+ extra_args=(${extra_args} --gadget-dir-name "${gadget_dir}")
+ fi
+
+ if [[ $iface_name == "" ]]; then
+ iface_name="usb0";
+ else
+ extra_args=(${extra_args} --iface-name "${iface_name}")
+ fi
+
+ CONFIGFS_HOME=${FAKE_CONFIGFS} ${SUT} ${extra_args[@]} stop
+
+ if test -d "${FAKE_GADGETFS}/${gadget_dir}"; then
+ test_fail "Gadget was not removed!"
+ fi
+}
+
+test_gadget_creation_no_macs() {
+ local gadget_dir="g1";
+ local product_name="Souvenier BMC"
+ local product_id="0xcafe"
+ local bind_device="f80002000.udc"
+ CONFIGFS_HOME=${FAKE_CONFIGFS} ${SUT} --product-id "${product_id}" \
+ --product-name "${product_name}" \
+ --bind-device "${bind_device}"
+
+ if test $? -ne 0; then
+ test_fail "${SUT} failed"
+ fi
+
+ if ! test -d "${FAKE_GADGETFS}/${gadget_dir}"; then
+ test_fail "Gadget was not created!"
+ fi
+
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/idVendor "0x18d1"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/idProduct "${product_id}"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/manufacturer "Google"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/product "${product_name}"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/MaxPower "100"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/strings/0x409/configuration "ECM"
+
+ if test -e ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0/dev_addr; then
+ test_fail "dev_addr should not be set"
+ fi
+
+ if test -e ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0/host_addr; then
+ test_fail "host_addr should not be set"
+ fi
+
+ local func_link="${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/ecm.usb0"
+ if ! test -L "${func_link}"; then
+ test_fail "Symlink to the function was not created in the config"
+ fi
+
+ local link_dest=$(realpath ${func_link})
+ if [[ $link_dest != ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.usb0 ]]; then
+ test_fail "Symlink points to the wrong file/dir"
+ fi
+
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/UDC "${bind_device}"
+}
+
+test_gadget_creation_alt_iface() {
+ local gadget_dir="g1";
+ local product_name="Souvenier BMC"
+ local product_id="0xcafe"
+ local bind_device="f80002000.udc"
+ local iface_name="iface0"
+ CONFIGFS_HOME=${FAKE_CONFIGFS} ${SUT} --product-id "${product_id}" \
+ --product-name "${product_name}" \
+ --bind-device "${bind_device}" \
+ --iface-name "${iface_name}"
+
+ if test $? -ne 0; then
+ test_fail "${SUT} failed"
+ fi
+
+ if ! test -d "${FAKE_GADGETFS}/${gadget_dir}"; then
+ test_fail "Gadget was not created!"
+ fi
+
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/idVendor "0x18d1"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/idProduct "${product_id}"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/manufacturer "Google"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/strings/0x409/product "${product_name}"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/MaxPower "100"
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/strings/0x409/configuration "ECM"
+
+ if ! test -d ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.${iface_name}; then
+ test_fail "Function directory was not created"
+ fi
+
+ if test -e ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.${iface_name}/dev_addr; then
+ test_fail "dev_addr should not be set"
+ fi
+
+ if test -e ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.${iface_name}/host_addr; then
+ test_fail "host_addr should not be set"
+ fi
+
+ local func_link="${FAKE_GADGETFS}/${gadget_dir}/configs/c.1/ecm.${iface_name}"
+ if ! test -L "${func_link}"; then
+ test_fail "Symlink to the function was not created in the config"
+ fi
+
+ local link_dest=$(realpath ${func_link})
+ if [[ $link_dest != ${FAKE_GADGETFS}/${gadget_dir}/functions/ecm.${iface_name} ]]; then
+ test_fail "Symlink points to the wrong file/dir"
+ fi
+
+ check_file_content ${FAKE_GADGETFS}/${gadget_dir}/UDC "${bind_device}"
+}
+
+
+# -------------------------------------------------------------------
+test_setup "Device Creation"
+
+test_gadget_creation_with_defaults
+
+test_teardown
+# -------------------------------------------------------------------
+
+# -------------------------------------------------------------------
+test_setup "Device Creation With Override"
+
+test_gadget_creation_with_override
+
+test_teardown
+# -------------------------------------------------------------------
+
+# -------------------------------------------------------------------
+test_setup "Test Device Stop"
+
+test_gadget_creation_with_defaults
+test_gadget_stopping
+
+test_teardown
+# -------------------------------------------------------------------
+
+# -------------------------------------------------------------------
+test_setup "Device Creation/Stopping, Alternative Name"
+
+test_gadget_creation_with_defaults "gAlt"
+test_gadget_stopping "gAlt"
+
+test_teardown
+# -------------------------------------------------------------------
+
+# -------------------------------------------------------------------
+test_setup "Device Creation without MAC Addrs"
+
+test_gadget_creation_no_macs
+
+test_teardown
+# -------------------------------------------------------------------
+
+# -------------------------------------------------------------------
+test_setup "Device Creation/Stopping, Alternative Interface"
+
+test_gadget_creation_alt_iface
+
+test_teardown
+# -------------------------------------------------------------------
+
+echo "SUCCESS!"
diff --git a/meta-google/recipes-google/networking/google-usb-network_git.bb b/meta-google/recipes-google/networking/google-usb-network_git.bb
new file mode 100644
index 000000000..ec51eaa5b
--- /dev/null
+++ b/meta-google/recipes-google/networking/google-usb-network_git.bb
@@ -0,0 +1,64 @@
+SUMMARY = "Google USB ECM Gadget Configuration Script"
+DESCRIPTION = "Google USB ECM Gadget Configuration Script"
+PR = "r1"
+PV = "0.2"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+FILESEXTRAPATHS_prepend = "${THISDIR}/${PN}:"
+
+inherit systemd
+
+DEPENDS += "m4-native"
+DEPENDS += "systemd"
+RDEPENDS_${PN} += "bash"
+
+SYSTEMD_PACKAGES = "${PN}"
+SYSTEMD_SERVICE_${PN} = "usb_network.service"
+
+BMC_IP_ADDR ??= "169.254.95.118/16"
+BMC_USB_ECM_PRODUCT_ID ??= ""
+BMC_USB_ECM_PRODUCT_NAME ??= "${MACHINE} BMC"
+BMC_USB_ECM_HOST_MAC ??= "invalid"
+BMC_USB_ECM_DEV_MAC ??= "invalid"
+BMC_USB_ECM_BIND_DEV ??= ""
+BMC_USB_CONFIG_PRIORITY ??= ""
+BMC_USB_CONFIG_FILENAME ??= "${BMC_USB_CONFIG_PRIORITY}-bmc-usb0.network"
+
+SRC_URI += "file://00-bmc-usb0.network.m4"
+SRC_URI += "file://usb_network.service.m4"
+SRC_URI += "file://usb_network.sh"
+
+FILES_${PN} = "${bindir}/usb_network.sh"
+FILES_${PN}_append = " ${systemd_unitdir}/network/${BMC_USB_CONFIG_FILENAME}"
+
+do_compile() {
+ test "X${BMC_IP_ADDR}" != "X" || bberror "Please define BMC_IP_ADDR"
+ m4 -DM_BMC_IP_ADDR=${BMC_IP_ADDR} ${WORKDIR}/00-bmc-usb0.network.m4 > ${S}/00-bmc-usb0.network
+
+ test "X${BMC_USB_ECM_PRODUCT_ID}" != "X" || bberror "Please define BMC_USB_ECM_PRODUCT_ID"
+ test "X${BMC_USB_ECM_PRODUCT_NAME}" != "X" || bberror "Please define BMC_USB_ECM_PRODUCT_NAME"
+ test "X${BMC_USB_ECM_BIND_DEV}" != "X" || bberror "Please define BMC_USB_ECM_BIND_DEV"
+
+ m4 \
+ -DM_BMC_USB_ECM_PRODUCT_ID="${BMC_USB_ECM_PRODUCT_ID}" \
+ -DM_BMC_USB_ECM_PRODUCT_NAME="${BMC_USB_ECM_PRODUCT_NAME}" \
+ -DM_BMC_USB_ECM_HOST_MAC="${BMC_USB_ECM_HOST_MAC}" \
+ -DM_BMC_USB_ECM_DEV_MAC="${BMC_USB_ECM_DEV_MAC}" \
+ -DM_BMC_USB_ECM_BIND_DEV="${BMC_USB_ECM_BIND_DEV}" \
+ -DM_SCRIPT_INSTALL_DIR="${bindir}" \
+ ${WORKDIR}/usb_network.service.m4 > ${S}/usb_network.service
+}
+
+do_install() {
+ install -d ${D}/${bindir}
+ install -m 0755 ${WORKDIR}/usb_network.sh ${D}/${bindir}
+
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${S}/usb_network.service ${D}${systemd_system_unitdir}
+
+ install -d ${D}${systemd_unitdir}/network
+ install -m 0644 ${S}/00-bmc-usb0.network \
+ ${D}${systemd_unitdir}/network/${BMC_USB_CONFIG_FILENAME}
+}
diff --git a/meta-google/recipes-phosphor/flash/dummy-gbmc-update.bb b/meta-google/recipes-phosphor/flash/dummy-gbmc-update.bb
new file mode 100644
index 000000000..7eba3b0fc
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/dummy-gbmc-update.bb
@@ -0,0 +1,23 @@
+SUMMARY = "Dummy image uploader for sending debug binaries"
+DESCRIPTION = "Dummy image uploader for sending debug binaries"
+PR = "r1"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit systemd
+
+SRC_URI += "file://config-dummy.json"
+SRC_URI += "file://dummy-verify.service"
+
+FILES_${PN} += "${datadir}/phosphor-ipmi-flash"
+
+SYSTEMD_SERVICE_${PN} += "dummy-verify.service"
+
+do_install() {
+ install -d ${D}${datadir}/phosphor-ipmi-flash
+ install -m 0644 ${WORKDIR}/config-dummy.json ${D}${datadir}/phosphor-ipmi-flash
+
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/dummy-verify.service ${D}${systemd_system_unitdir}
+}
diff --git a/meta-google/recipes-phosphor/flash/dummy-gbmc-update/config-dummy.json b/meta-google/recipes-phosphor/flash/dummy-gbmc-update/config-dummy.json
new file mode 100644
index 000000000..e68e9105b
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/dummy-gbmc-update/config-dummy.json
@@ -0,0 +1,19 @@
+[{
+ "blob": "/flash/dummy",
+ "handler": {
+ "type": "file",
+ "path": "/run/initramfs/bmc-image"
+ },
+ "actions": {
+ "preparation": {
+ "type": "skip"
+ },
+ "verification": {
+ "type": "systemd",
+ "unit": "dummy-verify.service"
+ },
+ "update": {
+ "type": "skip"
+ }
+ }
+}]
diff --git a/meta-google/recipes-phosphor/flash/dummy-gbmc-update/dummy-verify.service b/meta-google/recipes-phosphor/flash/dummy-gbmc-update/dummy-verify.service
new file mode 100644
index 000000000..ec320d551
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/dummy-gbmc-update/dummy-verify.service
@@ -0,0 +1,6 @@
+[Unit]
+Description=Dummy flash file verification
+
+[Service]
+Type=oneshot
+ExecStart=/bin/mv /run/initramfs/bmc-image /run/initramfs/dummy
diff --git a/meta-google/recipes-phosphor/flash/google-key.bb b/meta-google/recipes-phosphor/flash/google-key.bb
new file mode 100644
index 000000000..220211526
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/google-key.bb
@@ -0,0 +1,26 @@
+SUMMARY = "Google Key installation Script"
+DESCRIPTION = "Google Key installation Script"
+PR = "r1"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+RDEPENDS_${PN} += "bash"
+RDEPENDS_${PN} += "gnupg"
+
+SRC_URI += " \
+ file://platforms_gbmc_bringup.gpg \
+ file://platforms_gbmc_secure.gpg \
+ file://verify-bmc-image.sh \
+"
+
+do_install() {
+ # Install keys into image.
+ install -d -m 0755 ${D}${datadir}/google-key
+ install -m 0644 ${WORKDIR}/platforms_gbmc_secure.gpg ${D}${datadir}/google-key/prod.key
+ install -m 0644 ${WORKDIR}/platforms_gbmc_bringup.gpg ${D}${datadir}/google-key/dev.key
+
+ # Install the verification helper
+ install -d -m 0755 ${D}${bindir}
+ install -m 0755 ${WORKDIR}/verify-bmc-image.sh ${D}${bindir}
+}
diff --git a/meta-google/recipes-phosphor/flash/google-key/platforms_gbmc_bringup.gpg b/meta-google/recipes-phosphor/flash/google-key/platforms_gbmc_bringup.gpg
new file mode 100644
index 000000000..f347e224b
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/google-key/platforms_gbmc_bringup.gpg
Binary files differ
diff --git a/meta-google/recipes-phosphor/flash/google-key/platforms_gbmc_secure.gpg b/meta-google/recipes-phosphor/flash/google-key/platforms_gbmc_secure.gpg
new file mode 100644
index 000000000..9281f7790
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/google-key/platforms_gbmc_secure.gpg
Binary files differ
diff --git a/meta-google/recipes-phosphor/flash/google-key/verify-bmc-image.sh b/meta-google/recipes-phosphor/flash/google-key/verify-bmc-image.sh
new file mode 100755
index 000000000..cac229a94
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/google-key/verify-bmc-image.sh
@@ -0,0 +1,63 @@
+#!/bin/bash
+# Copyright 2021 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+help_out() {
+ echo "$ARG0 [--allow-dev] <image file> <sig file>" >&2
+ exit 2
+}
+
+opts="$(getopt -o 'd' -l 'allow-dev' -- "$@")" || exit
+dev=
+eval set -- "$opts"
+while true; do
+ case "$1" in
+ --allow-dev|-d)
+ dev=1
+ shift
+ ;;
+ --)
+ shift
+ break
+ ;;
+ *)
+ echo "Bad option: $1" >&2
+ help_out
+ ;;
+ esac
+done
+image_file="${1?Missing image file}" || help_out
+sig_file="${2?Missing sig file}" || help_out
+
+# gnupg needs a home directory even though we don't want to persist any
+# information. We always make a new temporary directory for this
+GNUPGHOME=
+cleanup() {
+ test -n "$GNUPGHOME" && rm -rf "$GNUPGHOME"
+}
+trap cleanup ERR EXIT INT
+export GNUPGHOME="$(mktemp -d)" || exit
+
+gpg() {
+ command gpg --batch --allow-non-selfsigned-uid --no-tty "$@"
+}
+import_key() {
+ gpg --import "/usr/share/google-key/$1.key"
+}
+
+import_key prod
+if [ -n "$dev" ]; then
+ import_key dev
+fi
+gpg --verify --ignore-time-conflict "$sig_file" "$image_file"
diff --git a/meta-google/recipes-phosphor/flash/inplace-gbmc-update.bb b/meta-google/recipes-phosphor/flash/inplace-gbmc-update.bb
new file mode 100644
index 000000000..c71a579e1
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/inplace-gbmc-update.bb
@@ -0,0 +1,44 @@
+SUMMARY = "Google BMC Inplace Update Script"
+DESCRIPTION = "Google BMC Inplace Update Script"
+PR = "r1"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit obmc-phosphor-systemd
+
+PROVIDES += "virtual/bmc-update"
+RPROVIDES_${PN} += "virtual/bmc-update"
+
+RDEPENDS_${PN} += "google-key"
+RDEPENDS_${PN} += "bash"
+
+SRC_URI += " \
+ file://config-bmc.json \
+ file://inplace-gbmc-verify.service \
+ file://inplace-gbmc-verify.sh \
+ file://inplace-gbmc-version.service \
+ file://inplace-gbmc-version.sh \
+"
+
+SYSTEMD_SERVICE_${PN} += "inplace-gbmc-verify.service"
+SYSTEMD_SERVICE_${PN} += "inplace-gbmc-version.service"
+
+FILES_${PN} += "${datadir}/phosphor-ipmi-flash"
+
+do_install() {
+ sed -i 's,@ALLOW_DEV@,,' ${WORKDIR}/inplace-gbmc-verify.sh
+
+ install -d ${D}${bindir}
+ install -m 0755 ${WORKDIR}/*.sh ${D}${bindir}
+
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/*.service ${D}${systemd_system_unitdir}
+
+ install -d ${D}${datadir}/phosphor-ipmi-flash
+ install -m 0644 ${WORKDIR}/config-bmc.json ${D}${datadir}/phosphor-ipmi-flash
+}
+
+do_install_prepend_dev() {
+ sed -i 's,@ALLOW_DEV@,--allow-dev,' ${WORKDIR}/inplace-gbmc-verify.sh
+}
diff --git a/meta-google/recipes-phosphor/flash/inplace-gbmc-update/config-bmc.json b/meta-google/recipes-phosphor/flash/inplace-gbmc-update/config-bmc.json
new file mode 100644
index 000000000..8bd11f2e1
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/inplace-gbmc-update/config-bmc.json
@@ -0,0 +1,33 @@
+[{
+ "blob": "/flash/image",
+ "version": {
+ "handler": {
+ "type": "file",
+ "path": "/run/inplace-gbmc-version"
+ },
+ "actions":{
+ "open": {
+ "type": "systemd",
+ "unit": "inplace-gbmc-version.service"
+ }
+ }
+ },
+ "handler": {
+ "type": "file",
+ "path": "/run/initramfs/bmc-image"
+ },
+ "actions": {
+ "preparation": {
+ "type": "skip"
+ },
+ "verification": {
+ "type": "systemd",
+ "unit": "inplace-gbmc-verify.service"
+ },
+ "update": {
+ "type": "systemd",
+ "unit": "reboot.target",
+ "mode": "replace-irreversibly"
+ }
+ }
+}]
diff --git a/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-verify.service b/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-verify.service
new file mode 100644
index 000000000..4552780af
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-verify.service
@@ -0,0 +1,6 @@
+[Unit]
+Description=Verify the Flash Image File
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/inplace-gbmc-verify.sh
diff --git a/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-verify.sh b/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-verify.sh
new file mode 100644
index 000000000..d5307d3d1
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-verify.sh
@@ -0,0 +1,57 @@
+#!/bin/bash
+# Copyright 2021 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+# This script will check the signature for the BMC image against
+# the baked in keyring available. If any aspect of this fails,
+# the scripts returns non-zero and this can be reported to the
+# host.
+#
+# 1. Verify the image
+# 2. Rename the image
+
+KEYRING=/etc/googlekeys/gbmc/gbmc.gpg
+SIGNATURE_FILE=/tmp/bmc.sig
+STATUS_FILE=/tmp/bmc.verify
+
+# Store in /run/initramfs because the behaviour of mv changes
+# depending on whether the file is moving within a tree or not.
+IMAGE_FILE=/run/initramfs/bmc-image
+VERIFIED_FILE=/run/initramfs/image-bmc
+
+# Make sure we run ERR traps when a function returns an error
+set -e
+
+# Write out the result of the script to a status file upon exiting
+# normally or due to an error
+exit_handler() {
+ local status="$?"
+ if (( status == 0 )); then
+ echo "success" >"${STATUS_FILE}"
+ else
+ echo "failed" >"${STATUS_FILE}"
+ fi
+ trap - EXIT ERR
+ exit "$status"
+}
+trap exit_handler EXIT ERR
+
+echo "running" > ${STATUS_FILE}
+
+# Verify the image.
+verify-bmc-image.sh @ALLOW_DEV@ "$IMAGE_FILE" "$SIGNATURE_FILE" || exit
+
+# Rename the staged file for initramfs updates.
+mv ${IMAGE_FILE} ${VERIFIED_FILE}#!/bin/bash
diff --git a/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-version.service b/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-version.service
new file mode 100644
index 000000000..3f6b67179
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-version.service
@@ -0,0 +1,9 @@
+[Unit]
+Description=Version string for inplace BMC
+
+[Service]
+Type=oneshot
+StandardOutput=file:/run/inplace-gbmc-version
+StandardError=journal
+ExecStartPre=/bin/rm -f /run/inplace-gbmc-version
+ExecStart=/usr/bin/inplace-gbmc-version.sh
diff --git a/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-version.sh b/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-version.sh
new file mode 100644
index 000000000..0c5c4e787
--- /dev/null
+++ b/meta-google/recipes-phosphor/flash/inplace-gbmc-update/inplace-gbmc-version.sh
@@ -0,0 +1,16 @@
+#!/bin/bash
+# Copyright 2021 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+grep '^VERSION_ID=' /etc/os-release | sed 's,.*-\([^-]*\),\1,g' | tr -d '\n'#!/bin/bash
diff --git a/meta-google/recipes-phosphor/images/obmc-phosphor-image.bbappend b/meta-google/recipes-phosphor/images/obmc-phosphor-image.bbappend
index 0c74fc8bb..942dfc14c 100644
--- a/meta-google/recipes-phosphor/images/obmc-phosphor-image.bbappend
+++ b/meta-google/recipes-phosphor/images/obmc-phosphor-image.bbappend
@@ -4,6 +4,7 @@ OBMC_IMAGE_EXTRA_INSTALL_append = " phosphor-ipmi-blobs"
OBMC_IMAGE_EXTRA_INSTALL_append = " phosphor-ipmi-ethstats"
OBMC_IMAGE_EXTRA_INSTALL_append = " phosphor-ipmi-flash"
+# Google BMC (gBMC) specific installs
OBMC_IMAGE_EXTRA_INSTALL_append_gbmc = " iproute2 iproute2-ss"
OBMC_IMAGE_EXTRA_INSTALL_append_gbmc = " gbmc-systemd-config"
OBMC_IMAGE_EXTRA_INSTALL_append_gbmc = " gbmc-iperf3"
@@ -13,5 +14,12 @@ OBMC_IMAGE_EXTRA_INSTALL_append_gbmc = \
'${@"" if not d.getVar("GBMC_NCSI_IF_NAME") else " gbmc-ncsi-config"}'
OBMC_IMAGE_EXTRA_INSTALL_append_gbmc = \
'${@"" if not d.getVar("GBMC_MAC_EEPROM_OF_NAME") else " gbmc-mac-config"}'
-OBMC_IMAGE_EXTRA_INSTALL_append_gbmc = \
- '${@"" if not d.getVar("GBMC_KCS_DEV") else " gbmc-kcs-config"}'
+
+# Include these useful utilities for all gbmc platforms
+OBMC_IMAGE_EXTRA_INSTALL_append_gbmc = " ipmitool"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbmc = " iotools"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbmc = " lrzsz"
+
+# Add gBMC update recipes
+OBMC_IMAGE_EXTRA_INSTALL_append_gbmc = " dummy-gbmc-update"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbmc = " virtual/bmc-update"
diff --git a/meta-google/recipes-phosphor/ipmi/phosphor-ipmi-config.bbappend b/meta-google/recipes-phosphor/ipmi/phosphor-ipmi-config.bbappend
new file mode 100644
index 000000000..03e99b2d0
--- /dev/null
+++ b/meta-google/recipes-phosphor/ipmi/phosphor-ipmi-config.bbappend
@@ -0,0 +1,22 @@
+FILESEXTRAPATHS_prepend_gbmc := "${THISDIR}/${PN}:"
+
+SRC_URI_append_gbmc = " file://gbmc_bridge.json"
+
+DEPENDS_append_gbmc = " jq-native"
+
+GBMCBR_IPMI_CHANNEL ?= "11"
+
+# Replace a channel in config.json to add gbmcbr reporting
+do_install_append_gbmc() {
+ chjson=${D}${datadir}/ipmi-providers/channel_config.json
+ overlapping="$(jq '."${GBMCBR_IPMI_CHANNEL}" | .is_valid and .name != "gbmcbr"' $chjson)"
+ if [ "$overlapping" != "false" ]; then
+ echo "gBMC channel config overlaps on ${GBMCBR_IPMI_CHANNEL}" >&2
+ cat $chjson
+ exit 1
+ fi
+ jq --slurpfile brcfg ${WORKDIR}/gbmc_bridge.json \
+ '. + {"${GBMCBR_IPMI_CHANNEL}": $brcfg[0]}' $chjson >${WORKDIR}/tmp
+ mv ${WORKDIR}/tmp $chjson
+}
+
diff --git a/meta-google/recipes-phosphor/ipmi/phosphor-ipmi-config/gbmc_bridge.json b/meta-google/recipes-phosphor/ipmi/phosphor-ipmi-config/gbmc_bridge.json
new file mode 100644
index 000000000..f87728388
--- /dev/null
+++ b/meta-google/recipes-phosphor/ipmi/phosphor-ipmi-config/gbmc_bridge.json
@@ -0,0 +1,11 @@
+{
+ "name" : "gbmcbr",
+ "is_valid" : true,
+ "active_sessions" : 0,
+ "channel_info" : {
+ "medium_type" : "lan-802.3",
+ "protocol_type" : "ipmb-1.0",
+ "session_supported" : "multi-session",
+ "is_ipmi" : true
+ }
+}
diff --git a/meta-google/recipes-phosphor/settings/phosphor-settings-manager/timemanager-default-HOST-MANUAL.override.yml b/meta-google/recipes-phosphor/settings/phosphor-settings-manager/timemanager-default-HOST-MANUAL.override.yml
index 77c0dff08..d7d46ec03 100644
--- a/meta-google/recipes-phosphor/settings/phosphor-settings-manager/timemanager-default-HOST-MANUAL.override.yml
+++ b/meta-google/recipes-phosphor/settings/phosphor-settings-manager/timemanager-default-HOST-MANUAL.override.yml
@@ -1,3 +1,17 @@
+# Copyright 2021 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
---
/xyz/openbmc_project/time/sync_method:
- Interface: xyz.openbmc_project.Time.Synchronization