meta-ampere: Initial AmpereOne(TM) Mt. Mitchell's non-DC-SCM BMC support

Add new Mt.Mitchell platform with basic features so that it can be
compiled and works.

Tested:
1. Compile for Mt.Mitchell successful.
2. Flash and check for the firmware can boot on the Mt.Mitchell
non-DC-SCM system without issue

Signed-off-by: Chanh Nguyen <chanh@os.amperecomputing.com>
Change-Id: I8dc9db9029b27c0c6325c31d368cdbb614a3c8b6
diff --git a/meta-ampere/meta-mitchell/conf/layer.conf b/meta-ampere/meta-mitchell/conf/layer.conf
new file mode 100644
index 0000000..3855afb
--- /dev/null
+++ b/meta-ampere/meta-mitchell/conf/layer.conf
@@ -0,0 +1,11 @@
+# We have a conf and classes directory, add to BBPATH
+BBPATH .= ":${LAYERDIR}"
+
+# We have recipes-* directories, add to BBFILES
+BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
+            ${LAYERDIR}/recipes-*/*/*.bbappend"
+
+BBFILE_COLLECTIONS += "mitchell-layer"
+BBFILE_PATTERN_mitchell-layer := "^${LAYERDIR}/"
+LAYERSERIES_COMPAT_mitchell-layer = "kirkstone langdale"
+
diff --git a/meta-ampere/meta-mitchell/conf/machine/mtmitchell.conf b/meta-ampere/meta-mitchell/conf/machine/mtmitchell.conf
new file mode 100644
index 0000000..85e6f4f
--- /dev/null
+++ b/meta-ampere/meta-mitchell/conf/machine/mtmitchell.conf
@@ -0,0 +1,42 @@
+KMACHINE = "aspeed"
+KERNEL_DEVICETREE = "${KMACHINE}-bmc-ampere-mtmitchell.dtb"
+UBOOT_DEVICETREE = "ast2600-bletchley"
+UBOOT_MACHINE = "ast2600_openbmc_spl_defconfig"
+SPL_BINARY = "spl/u-boot-spl.bin"
+SOCSEC_SIGN_ENABLE = "0"
+
+SERIAL_CONSOLES = "115200;ttyS4"
+
+require conf/machine/include/ast2600.inc
+require conf/machine/include/obmc-bsp-common.inc
+
+FLASH_SIZE = "65536"
+VOLATILE_LOG_DIR = "no"
+
+MACHINE_FEATURES += "\
+                          obmc-bmc-state-mgmt \
+                          obmc-chassis-state-mgmt \
+                          obmc-host-ipmi \
+                          obmc-host-state-mgmt \
+                          obmc-phosphor-chassis-mgmt \
+                          obmc-phosphor-flash-mgmt \
+                         "
+
+OBMC_IMAGE_EXTRA_INSTALL:append = " \
+                                   ampere-utils \
+                                   ampere-usbnet \
+                                   phosphor-misc-usb-ctrl \
+                                   ampere-platform-init \
+                                   ampere-ipmi-oem \
+                                   phosphor-ipmi-blobs \
+                                   phosphor-ipmi-blobs-binarystore \
+                                   util-linux \
+                                  "
+
+PREFERRED_PROVIDER_virtual/obmc-chassis-mgmt = "packagegroup-obmc-ampere-apps"
+PREFERRED_PROVIDER_virtual/obmc-system-mgmt = "packagegroup-obmc-ampere-apps"
+PREFERRED_PROVIDER_virtual/obmc-flash-mgmt = "packagegroup-obmc-ampere-apps"
+PREFERRED_PROVIDER_virtual/obmc-host-ipmi-hw = "phosphor-ipmi-ssif"
+PREFERRED_PROVIDER_virtual/phosphor-led-manager-config-native = "ampere-led-manager-config-native"
+
+OVERRIDES .= ":ampere"
diff --git a/meta-ampere/meta-mitchell/conf/templates/default/bblayers.conf.sample b/meta-ampere/meta-mitchell/conf/templates/default/bblayers.conf.sample
new file mode 100644
index 0000000..a6e860f
--- /dev/null
+++ b/meta-ampere/meta-mitchell/conf/templates/default/bblayers.conf.sample
@@ -0,0 +1,31 @@
+# LAYER_CONF_VERSION is increased each time build/conf/bblayers.conf
+# changes incompatibly
+LCONF_VERSION = "8"
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+
+BBLAYERS ?= " \
+  ##OEROOT##/meta \
+  ##OEROOT##/meta-openembedded/meta-oe \
+  ##OEROOT##/meta-openembedded/meta-networking \
+  ##OEROOT##/meta-openembedded/meta-perl \
+  ##OEROOT##/meta-openembedded/meta-python \
+  ##OEROOT##/meta-security \
+  ##OEROOT##/meta-phosphor \
+  ##OEROOT##/meta-aspeed \
+  ##OEROOT##/meta-ampere \
+  ##OEROOT##/meta-ampere/meta-mitchell \
+  "
+BBLAYERS_NON_REMOVABLE ?= " \
+  ##OEROOT##/meta \
+  ##OEROOT##/meta-openembedded/meta-oe \
+  ##OEROOT##/meta-openembedded/meta-networking \
+  ##OEROOT##/meta-openembedded/meta-perl \
+  ##OEROOT##/meta-openembedded/meta-python \
+  ##OEROOT##/meta-security \
+  ##OEROOT##/meta-phosphor \
+  ##OEROOT##/meta-aspeed \
+  ##OEROOT##/meta-ampere \
+  ##OEROOT##/meta-ampere/meta-mitchell \
+  "
diff --git a/meta-ampere/meta-mitchell/conf/templates/default/conf-notes.txt b/meta-ampere/meta-mitchell/conf/templates/default/conf-notes.txt
new file mode 100644
index 0000000..9b3c01a
--- /dev/null
+++ b/meta-ampere/meta-mitchell/conf/templates/default/conf-notes.txt
@@ -0,0 +1,2 @@
+Common targets are:
+     obmc-phosphor-image
diff --git a/meta-ampere/meta-mitchell/conf/templates/default/local.conf.sample b/meta-ampere/meta-mitchell/conf/templates/default/local.conf.sample
new file mode 100644
index 0000000..b852ff0
--- /dev/null
+++ b/meta-ampere/meta-mitchell/conf/templates/default/local.conf.sample
@@ -0,0 +1,214 @@
+#
+# This file is your local configuration file and is where all local user settings
+# are placed. The comments in this file give some guide to the options a new user
+# to the system might want to change but pretty much any configuration option can
+# be set in this file.
+#
+# Lines starting with the '#' character are commented out and in some cases the
+# default values are provided as comments to show people example syntax. Enabling
+# the option is a question of removing the # character and making any change to the
+# variable as required.
+
+#
+# Machine Selection
+#
+MACHINE ??= "mtmitchell"
+
+#
+# Where to place downloads
+#
+# During a first build the system will download many different source code tarballs
+# from various upstream projects. This can take a while, particularly if your network
+# connection is slow. These are all stored in DL_DIR. When wiping and rebuilding you
+# can preserve this directory to speed up this part of subsequent builds. This directory
+# is safe to share between multiple builds on the same machine too.
+#
+# The default is a downloads directory under TOPDIR which is the build directory.
+#
+#DL_DIR ?= "${TOPDIR}/downloads"
+
+#
+# Where to place shared-state files
+#
+# BitBake has the capability to accelerate builds based on previously built output.
+# This is done using "shared state" files which can be thought of as cache objects
+# and this option determines where those files are placed.
+#
+# You can wipe out TMPDIR leaving this directory intact and the build would regenerate
+# from these files if no changes were made to the configuration. If changes were made
+# to the configuration, only shared state files where the state was still valid would
+# be used (done using checksums).
+#
+# The default is a sstate-cache directory under TOPDIR.
+#
+#SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
+
+#
+# Where to place the build output
+#
+# This option specifies where the bulk of the building work should be done and
+# where BitBake should place its temporary files and output. Keep in mind that
+# this includes the extraction and compilation of many applications and the toolchain
+# which can use Gigabytes of hard disk space.
+#
+# The default is a tmp directory under TOPDIR.
+#
+#TMPDIR = "${TOPDIR}/tmp"
+
+#
+# Default policy config
+#
+# The distribution setting controls which policy settings are used as defaults.
+# The default value is fine for general Yocto project use, at least initially.
+# Ultimately when creating custom policy, people will likely end up subclassing
+# these defaults.
+#
+DISTRO ?= "openbmc-phosphor"
+# As an example of a subclass there is a "bleeding" edge policy configuration
+# where many versions are set to the absolute latest code from the upstream
+# source control systems. This is just mentioned here as an example, its not
+# useful to most new users.
+# DISTRO ?= "poky-bleeding"
+
+#
+# Package Management configuration
+#
+# This variable lists which packaging formats to enable. Multiple package backends
+# can be enabled at once and the first item listed in the variable will be used
+# to generate the root filesystems.
+# Options are:
+#  - 'package_deb' for debian style deb files
+#  - 'package_ipk' for ipk files are used by opkg (a debian style embedded package manager)
+#  - 'package_rpm' for rpm style packages
+# E.g.: PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk"
+# We default to ipk:
+PACKAGE_CLASSES ?= "package_ipk"
+
+#
+# SDK/ADT target architecture
+#
+# This variable specifies the architecture to build SDK/ADT items for and means
+# you can build the SDK packages for architectures other than the machine you are
+# running the build on (i.e. building i686 packages on an x86_64 host).
+# Supported values are i686 and x86_64
+#SDKMACHINE ?= "i686"
+
+SANITY_TESTED_DISTROS:append ?= " *"
+
+#
+# Extra image configuration defaults
+#
+# The EXTRA_IMAGE_FEATURES variable allows extra packages to be added to the generated
+# images. Some of these options are added to certain image types automatically. The
+# variable can contain the following options:
+#  "dbg-pkgs"       - add -dbg packages for all installed packages
+#                     (adds symbol information for debugging/profiling)
+#  "dev-pkgs"       - add -dev packages for all installed packages
+#                     (useful if you want to develop against libs in the image)
+#  "ptest-pkgs"     - add -ptest packages for all ptest-enabled packages
+#                     (useful if you want to run the package test suites)
+#  "tools-sdk"      - add development tools (gcc, make, pkgconfig etc.)
+#  "tools-debug"    - add debugging tools (gdb, strace)
+#  "eclipse-debug"  - add Eclipse remote debugging support
+#  "tools-profile"  - add profiling tools (oprofile, exmap, lttng, valgrind)
+#  "tools-testapps" - add useful testing tools (ts_print, aplay, arecord etc.)
+#  "debug-tweaks"   - make an image suitable for development
+#                     e.g. ssh root access has a blank password
+# There are other application targets that can be used here too, see
+# meta/classes/image.bbclass and meta/classes/core-image.bbclass for more details.
+# We default to enabling the debugging tweaks.
+EXTRA_IMAGE_FEATURES ?= "debug-tweaks"
+
+#
+# Additional image features
+#
+# The following is a list of additional classes to use when building images which
+# enable extra features. Some available options which can be included in this variable
+# are:
+#   - 'buildstats' collect build statistics
+#   - 'image-swab' to perform host system intrusion detection
+# NOTE: if listing mklibs & prelink both, then make sure mklibs is before prelink
+# NOTE: mklibs also needs to be explicitly enabled for a given image, see local.conf.extended
+USER_CLASSES ?= "buildstats"
+
+#
+# Runtime testing of images
+#
+# The build system can test booting virtual machine images under qemu (an emulator)
+# after any root filesystems are created and run tests against those images. To
+# enable this uncomment this line. See classes/testimage(-auto).bbclass for
+# further details.
+#TEST_IMAGE = "1"
+#
+# Interactive shell configuration
+#
+# Under certain circumstances the system may need input from you and to do this it
+# can launch an interactive shell. It needs to do this since the build is
+# multithreaded and needs to be able to handle the case where more than one parallel
+# process may require the user's attention. The default is iterate over the available
+# terminal types to find one that works.
+#
+# Examples of the occasions this may happen are when resolving patches which cannot
+# be applied, to use the devshell or the kernel menuconfig
+#
+# Supported values are auto, gnome, xfce, rxvt, screen, konsole (KDE 3.x only), none
+# Note: currently, Konsole support only works for KDE 3.x due to the way
+# newer Konsole versions behave
+#OE_TERMINAL = "auto"
+# By default disable interactive patch resolution (tasks will just fail instead):
+PATCHRESOLVE = "noop"
+
+#
+# Disk Space Monitoring during the build
+#
+# Monitor the disk space during the build. If there is less that 1GB of space or less
+# than 100K inodes in any key build location (TMPDIR, DL_DIR, SSTATE_DIR), gracefully
+# shutdown the build. If there is less that 100MB or 1K inodes, perform a hard abort
+# of the build. The reason for this is that running completely out of space can corrupt
+# files and damages the build in ways which may not be easily recoverable.
+# It's necessary to monitor /tmp, if there is no space left the build will fail
+# with very exotic errors.
+BB_DISKMON_DIRS ??= "\
+    STOPTASKS,${TMPDIR},1G,100K \
+    STOPTASKS,${DL_DIR},1G,100K \
+    STOPTASKS,${SSTATE_DIR},1G,100K \
+    STOPTASKS,/tmp,100M,100K \
+    HALT,${TMPDIR},100M,1K \
+    HALT,${DL_DIR},100M,1K \
+    HALT,${SSTATE_DIR},100M,1K \
+    HALT,/tmp,10M,1K"
+
+#
+# Shared-state files from other locations
+#
+# As mentioned above, shared state files are prebuilt cache data objects which can
+# used to accelerate build time. This variable can be used to configure the system
+# to search other mirror locations for these objects before it builds the data itself.
+#
+# This can be a filesystem directory, or a remote url such as http or ftp. These
+# would contain the sstate-cache results from previous builds (possibly from other
+# machines). This variable works like fetcher MIRRORS/PREMIRRORS and points to the
+# cache locations to check for the shared objects.
+# NOTE: if the mirror uses the same structure as SSTATE_DIR, you need to add PATH
+# at the end as shown in the examples below. This will be substituted with the
+# correct path within the directory structure.
+#SSTATE_MIRRORS ?= "\
+#file://.* http://someserver.tld/share/sstate/PATH;downloadfilename=PATH \n \
+#file://.* file:///some/local/dir/sstate/PATH"
+
+
+#
+# Qemu configuration
+#
+# By default qemu will build with a builtin VNC server where graphical output can be
+# seen. The two lines below enable the SDL backend too. This assumes there is a
+# libsdl library available on your build system.
+#PACKAGECONFIG_append_pn-qemu-native = " sdl"
+#PACKAGECONFIG_append_pn-nativesdk-qemu = " sdl"
+#ASSUME_PROVIDED += "libsdl-native"
+
+
+# CONF_VERSION is increased each time build/conf/ changes incompatibly and is used to
+# track the version of this file when it was generated. This can safely be ignored if
+# this doesn't mean anything to you.
+CONF_VERSION = "2"
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/packagegroups/packagegroup-obmc-ampere-apps.bb b/meta-ampere/meta-mitchell/recipes-ampere/packagegroups/packagegroup-obmc-ampere-apps.bb
new file mode 100644
index 0000000..d1c7e7e
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-ampere/packagegroups/packagegroup-obmc-ampere-apps.bb
@@ -0,0 +1,53 @@
+SUMMARY = "OpenBMC for Ampere - Applications"
+PR = "r1"
+
+inherit packagegroup
+
+PROVIDES = "${PACKAGES}"
+PACKAGES = " \
+        ${PN}-chassis \
+        ${PN}-flash \
+        ${PN}-system \
+        "
+
+PROVIDES += "virtual/obmc-chassis-mgmt"
+PROVIDES += "virtual/obmc-flash-mgmt"
+PROVIDES += "virtual/obmc-system-mgmt"
+
+RPROVIDES:${PN}-chassis += "virtual-obmc-chassis-mgmt"
+RPROVIDES:${PN}-flash += "virtual-obmc-flash-mgmt"
+RPROVIDES:${PN}-system += "virtual-obmc-system-mgmt"
+
+SUMMARY:${PN}-chassis = "Ampere Chassis"
+RDEPENDS:${PN}-chassis = " \
+                            obmc-phosphor-buttons-signals \
+                            obmc-phosphor-buttons-handler \
+                            obmc-op-control-power \
+                            ampere-hostctrl \
+                            phosphor-hostlogger \
+                            phosphor-sel-logger \
+                            phosphor-logging \
+                         "
+
+SUMMARY:${PN}-system = "Ampere System"
+RDEPENDS:${PN}-system = " \
+                         smbios-mdr \
+                        "
+
+SUMMARY:${PN}-flash = "Ampere Flash"
+RDEPENDS:${PN}-flash = " \
+                        phosphor-software-manager \
+                       "
+
+RDEPENDS:${PN}-inventory:append = " \
+                                   dbus-sensors \
+                                   entity-manager \
+                                  "
+
+RDEPENDS:${PN}-extras:append = " \
+                                webui-vue \
+                                phosphor-virtual-sensor \
+                               "
+RDEPENDS:${PN}-extras:remove = " phosphor-hwmon"
+
+VIRTUAL-RUNTIME_obmc-sensors-hwmon ?= "dbus-sensors"
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init.bb b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init.bb
new file mode 100644
index 0000000..dd5f599
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init.bb
@@ -0,0 +1,35 @@
+SUMMARY = "Phosphor OpenBMC Platform Init Service"
+DESCRIPTION = "Phosphor OpenBMC Platform Init Daemon"
+
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit systemd
+inherit obmc-phosphor-systemd
+
+DEPENDS += "systemd"
+RDEPENDS:${PN} += "libsystemd"
+RDEPENDS:${PN} += "bash"
+
+SRC_URI = " \
+           file://ampere-platform-init.service \
+           file://ampere-bmc-heartbeat.service \
+           file://ampere_platform_init.sh \
+           file://ampere_bmc_heartbeat.sh \
+           file://${MACHINE}_platform_gpios_init.sh \
+           file://gpio-lib.sh \
+          "
+SYSTEMD_PACKAGES = "${PN}"
+SYSTEMD_SERVICE:${PN} = "ampere-platform-init.service ampere-bmc-heartbeat.service"
+
+do_install () {
+    install -d ${D}${sbindir}
+    install -m 0755 ${WORKDIR}/gpio-lib.sh ${D}${sbindir}/
+    install -m 0755 ${WORKDIR}/ampere_platform_init.sh ${D}${sbindir}/
+    install -m 0755 ${WORKDIR}/ampere_bmc_heartbeat.sh ${D}${sbindir}/
+    install -m 0755 ${WORKDIR}/${MACHINE}_platform_gpios_init.sh ${D}${sbindir}/platform_gpios_init.sh
+    install -d ${D}${systemd_unitdir}/system/
+    install -m 0644 ${WORKDIR}/ampere-platform-init.service ${D}${systemd_unitdir}/system
+}
+
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere-bmc-heartbeat.service b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere-bmc-heartbeat.service
new file mode 100644
index 0000000..d491fd9
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere-bmc-heartbeat.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=Ampere BMC heartbeat service
+Wants=obmc-mapper.target
+After=obmc-mapper.target
+
+[Service]
+Type=simple
+Restart=always
+ExecStart=/usr/bin/env ampere_bmc_heartbeat.sh
+SyslogIdentifier = "ampere-bmc-heartbeat"
+
+[Install]
+WantedBy=multi-user.target
+
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere-platform-init.service b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere-platform-init.service
new file mode 100644
index 0000000..72a34cb
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere-platform-init.service
@@ -0,0 +1,11 @@
+[Unit]
+Description = Ampere Platform Initialization
+
+[Service]
+Restart=no
+RemainAfterExit=true
+Type=oneshot
+ExecStart=/usr/sbin/ampere_platform_init.sh
+
+[Install]
+WantedBy=sysinit.target
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere_bmc_heartbeat.sh b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere_bmc_heartbeat.sh
new file mode 100644
index 0000000..5ecea31
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere_bmc_heartbeat.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# shellcheck disable=SC2154
+# shellcheck source=/dev/null
+
+source /usr/sbin/gpio-lib.sh
+
+value=0
+while true;
+do
+	if [[ $value -eq 0 ]]; then
+		value=1
+		gpio_name_set led-sw-hb 1
+		gpio_name_set led-bmc-hb 0
+	else
+		value=0
+		gpio_name_set led-sw-hb 0
+		gpio_name_set led-bmc-hb 1
+	fi
+	sleep 1s
+done
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere_platform_init.sh b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere_platform_init.sh
new file mode 100644
index 0000000..33dc7ea
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/ampere_platform_init.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+
+# shellcheck disable=SC2154
+# shellcheck source=/dev/null
+
+source /usr/sbin/gpio-lib.sh
+source /usr/sbin/platform_gpios_init.sh
+
+#pre platform init function. implemented in platform_gpios_init.sh
+pre-platform-init
+
+# =======================================================
+# Setting default value for device sel and mux
+bootstatus=$(cat /sys/class/watchdog/watchdog0/bootstatus)
+if [ "$bootstatus" == '32' ]; then
+    echo "CONFIGURE: gpio pins to output high after AC power"
+    for gpioName in "${output_high_gpios_in_ac[@]}"; do
+        gpio_name_set "$gpioName" 1
+    done
+    echo "CONFIGURE: gpio pins to output low after AC power"
+    for gpioName in "${output_low_gpios_in_ac[@]}"; do
+        gpio_name_set "$gpioName" 0
+    done
+    echo "CONFIGURE: gpio pins to input after AC power"
+    for gpioName in "${input_gpios_in_ac[@]}"; do
+        gpio_name_input "$gpioName"
+    done
+fi
+
+# =======================================================
+# Setting default value for others gpio pins
+echo "CONFIGURE: gpio pins to output high"
+for gpioName in "${output_high_gpios_in_bmc_reboot[@]}"; do
+    gpio_name_set "$gpioName" 1
+done
+echo "CONFIGURE: gpio pins to output low"
+for gpioName in "${output_low_gpios_in_bmc_reboot[@]}"; do
+    gpio_name_set "$gpioName" 0
+done
+echo "CONFIGURE: gpio pins to input"
+for gpioName in "${input_gpios_in_bmc_reboot[@]}"; do
+    gpio_name_input "$gpioName"
+done
+
+#post platform init function. implemented in platform_gpios_init.sh
+post-platform-init
+
+exit 0
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/gpio-lib.sh b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/gpio-lib.sh
new file mode 100644
index 0000000..3e503c4
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/gpio-lib.sh
@@ -0,0 +1,72 @@
+#!/bin/bash
+
+# shellcheck disable=SC2154
+# shellcheck source=/dev/null
+
+# Configure GPIO as output and set its value
+AST2600_GPIO_BASE=(
+    816
+    780
+)
+
+function gpio_configure_output() {
+	echo "$1" > /sys/class/gpio/export
+	echo out > /sys/class/gpio/gpio"$1"/direction
+	echo "$2" > /sys/class/gpio/gpio"$1"/value
+	echo "$1" > /sys/class/gpio/unexport
+}
+
+function gpio_get_val() {
+	echo "$1" > /sys/class/gpio/export
+	cat /sys/class/gpio/gpio"$1"/value
+	echo "$1" > /sys/class/gpio/unexport
+}
+
+# Configure GPIO as input
+function gpio_configure_input() {
+	echo "$1" > /sys/class/gpio/export
+	echo "in" > /sys/class/gpio/gpio"$1"/direction
+	echo "$1" > /sys/class/gpio/unexport
+}
+
+function gpio_name_set()
+{
+    str=$(gpiofind "$1")
+    #Verify error code when run gpiofind
+    if [ "$?" == '1' ]; then
+        echo "Invalid gpio name $1"
+    else
+        gpioid=$(echo "$str"|cut -c 9)
+        offset=$(echo "$str"|cut -d " " -f 2)
+        gpioPin=$(("$offset" + ${AST2600_GPIO_BASE[$gpioid]}))
+        gpio_configure_output "$gpioPin" "$2"
+    fi
+}
+
+function gpio_name_get()
+{
+    str=$(gpiofind "$1")
+    #Verify error code when run gpiofind
+    if [ "$?" == '1' ]; then
+        echo "Invalid gpio name $1"
+    else
+        offset=$(echo "$str"|cut -d " " -f 2)
+        gpioid=$(echo "$str"|cut -c 9)
+        gpioPin=$(("$offset" + ${AST2600_GPIO_BASE[$gpioid]}))
+        gpio_get_val "$gpioPin"
+    fi
+}
+
+function gpio_name_input()
+{
+    str=$(gpiofind "$1")
+    #Verify error code when run gpiofind
+    if [ "$?" == '1' ]; then
+        echo "Invalid gpio name $1"
+    else
+        gpioid=$(echo "$str"|cut -c 9)
+        offset=$(echo "$str"|cut -d " " -f 2)
+        gpioPin=$(("$offset" + ${AST2600_GPIO_BASE[$gpioid]}))
+        gpio_configure_input "$gpioPin"
+    fi
+}
\ No newline at end of file
diff --git a/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/mtmitchell_platform_gpios_init.sh b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/mtmitchell_platform_gpios_init.sh
new file mode 100644
index 0000000..4c30466
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-ampere/platform/ampere-platform-init/mtmitchell_platform_gpios_init.sh
@@ -0,0 +1,105 @@
+#!/bin/bash
+
+# shellcheck disable=SC2154
+# shellcheck source=/dev/null
+
+source /usr/sbin/gpio-lib.sh
+
+function bind_rtc_driver() {
+    # If rtc device can not present, bind the device
+    if [[ ! -e /dev/rtc0 ]]; then
+        echo "Bind rtc driver"
+        echo 6-0051 > /sys/bus/i2c/drivers/rtc-pcf85063/bind
+    fi
+}
+
+function pre-platform-init() {
+    echo "Do pre platform init"
+}
+
+function post-platform-init() {
+    # gpio-leds is controlling bmc-ready, not by gpio
+    echo 1 > /sys/class/leds/bmc-ready/brightness
+
+    # Bind rtc driver
+    bind_rtc_driver
+}
+
+export output_high_gpios_in_ac=(
+    # add device enable, mux setting, device select gpios
+    "spi0-backup-sel"
+    "i2c-backup-sel"
+)
+
+export output_low_gpios_in_ac=(
+    # add device enable, mux setting, device select gpios
+    "spi0-program-sel"
+    "ocp-main-pwren"
+)
+
+export input_gpios_in_ac=(
+    # add device enable, mux setting, device select gpios
+)
+
+export output_high_gpios_in_bmc_reboot=(
+    "host0-sysreset-n"
+    "host0-pmin-n"
+    "vrd-sel"
+    "spd-sel"
+    "ext-high-temp-n"
+    "wd-disable-n"
+    "hpm-stby-rst-n"
+    "jtag-sel-s0"
+    "cpld-user-mode"
+    "jtag-srst-n"
+    "host0-shd-req-n"
+)
+
+export output_low_gpios_in_bmc_reboot=(
+    "rtc-battery-voltage-read-enable"
+    "s0-rtc-lock"
+    "hpm-fw-recovery"
+    "led-fault"
+    "spi-nor-access"
+    "host0-special-boot"
+)
+
+export input_gpios_in_bmc_reboot=(
+    "s0-vrd-fault-n"
+    "s1-vrd-fault-n"
+    "irq-n"
+    "presence-ps0"
+    "presence-ps1"
+    "hsc-12vmain-alt2-n"
+    "s0-pcp-oc-warn-n"
+    "s1-pcp-oc-warn-n"
+    "cpu-bios-recover"
+    "s0-heartbeat"
+    "hs-scout-proc-hot"
+    "s0-vr-hot-n"
+    "s1-vr-hot-n"
+    "hsc-12vmain-alt1-n"
+    "power-chassis-good"
+    "power-button"
+    "s0-ddr-save"
+    "soc-spi-nor-access"
+    "presence-cpu0"
+    "jtag-dbgr-prsnt-n"
+    "ps0-ac-loss-n"
+    "ps1-ac-loss-n"
+    "s1-ddr-save"
+    "sys-pgood"
+    "presence-cpu1"
+    "s0-fault-alert"
+    "s0-sys-auth-failure-n"
+    "host0-ready"
+    "ocp-pgood"
+    "s1-fault-alert"
+    "s1-fw-boot-ok"
+    "s0-spi-auth-fail-n"
+    "s1-sys-auth-failure-n"
+    "reset-button"
+    "ps0-pgood"
+    "ps1-pgood"
+    "s0-soc-pgood"
+)
diff --git a/meta-ampere/meta-mitchell/recipes-bsp/u-boot/u-boot-aspeed-sdk/ampere.cfg b/meta-ampere/meta-mitchell/recipes-bsp/u-boot/u-boot-aspeed-sdk/ampere.cfg
new file mode 100644
index 0000000..e88414a
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-bsp/u-boot/u-boot-aspeed-sdk/ampere.cfg
@@ -0,0 +1,2 @@
+CONFIG_PHY_NCSI=n
+
diff --git a/meta-ampere/meta-mitchell/recipes-bsp/u-boot/u-boot-aspeed-sdk_%.bbappend b/meta-ampere/meta-mitchell/recipes-bsp/u-boot/u-boot-aspeed-sdk_%.bbappend
new file mode 100644
index 0000000..133671c
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-bsp/u-boot/u-boot-aspeed-sdk_%.bbappend
@@ -0,0 +1,5 @@
+FILESEXTRAPATHS:append := "${THISDIR}/${PN}:"
+
+SRC_URI += " \
+            file://ampere.cfg \
+           "
diff --git a/meta-ampere/meta-mitchell/recipes-kernel/linux/linux-aspeed/ampere.cfg b/meta-ampere/meta-mitchell/recipes-kernel/linux/linux-aspeed/ampere.cfg
new file mode 100644
index 0000000..1990bf4
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-kernel/linux/linux-aspeed/ampere.cfg
@@ -0,0 +1,36 @@
+#
+# BOM
+#
+CONFIG_RTC_DRV_PCF85063=y
+CONFIG_IIO_MUX=y
+CONFIG_MUX_GPIO=y
+CONFIG_I2C_MUX=y
+
+CONFIG_SENSORS_IIO_HWMON=y
+CONFIG_ASPEED_ADC=y
+CONFIG_SENSORS_LM75=y
+CONFIG_SENSORS_EMC1403=y
+CONFIG_LTC2497=y
+CONFIG_I2C_SLAVE=y
+CONFIG_SENSORS_ASPEED=y
+
+CONFIG_USB_PHY=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_CONFIGFS=y
+CONFIG_USB_ASPEED_VHUB=y
+CONFIG_USB_CONFIGFS_ECM=y
+
+CONFIG_HWMON=y
+
+CONFIG_PWM=y
+CONFIG_PWM_SYSFS=y
+CONFIG_SENSORS_PWM_FAN=y
+CONFIG_SENSORS_ASPEED=y
+
+CONFIG_REGULATOR_FIXED_VOLTAGE=y
+CONFIG_REGULATOR=y
+
+CONFIG_SENSORS_MAX31790=y
+
+CONFIG_NET_NCSI=y
+CONFIG_NCSI_OEM_CMD_GET_MAC=y
diff --git a/meta-ampere/meta-mitchell/recipes-kernel/linux/linux-aspeed_%.bbappend b/meta-ampere/meta-mitchell/recipes-kernel/linux/linux-aspeed_%.bbappend
new file mode 100644
index 0000000..4cac8de
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-kernel/linux/linux-aspeed_%.bbappend
@@ -0,0 +1,5 @@
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+
+SRC_URI += " \
+            file://ampere.cfg \
+           "
diff --git a/meta-ampere/meta-mitchell/recipes-phosphor/ipmi/phosphor-ipmi-config.bbappend b/meta-ampere/meta-mitchell/recipes-phosphor/ipmi/phosphor-ipmi-config.bbappend
new file mode 100644
index 0000000..13ed796
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-phosphor/ipmi/phosphor-ipmi-config.bbappend
@@ -0,0 +1,2 @@
+FILESEXTRAPATHS:append := "${THISDIR}/${PN}:"
+
diff --git a/meta-ampere/meta-mitchell/recipes-phosphor/ipmi/phosphor-ipmi-config/channel_config.json b/meta-ampere/meta-mitchell/recipes-phosphor/ipmi/phosphor-ipmi-config/channel_config.json
new file mode 100644
index 0000000..4998665
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-phosphor/ipmi/phosphor-ipmi-config/channel_config.json
@@ -0,0 +1,178 @@
+{
+  "0" : {
+    "name" : "IPMB",
+    "is_valid" : true,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "ipmb",
+      "protocol_type" : "ipmb-1.0",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "1" : {
+    "name" : "eth0",
+    "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
+    }
+  },
+  "2" : {
+    "name" : "eth1",
+    "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
+    }
+  },
+  "3" : {
+    "name" : "usb0",
+    "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
+    }
+  },
+  "4" : {
+    "name" : "RESERVED",
+    "is_valid" : false,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "reserved",
+      "protocol_type" : "na",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "5" : {
+    "name" : "RESERVED",
+    "is_valid" : false,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "reserved",
+      "protocol_type" : "na",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "6" : {
+    "name" : "RESERVED",
+    "is_valid" : false,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "reserved",
+      "protocol_type" : "na",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "7" : {
+    "name" : "RESERVED",
+    "is_valid" : false,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "reserved",
+      "protocol_type" : "na",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "8" : {
+    "name" : "INTRABMC",
+    "is_valid" : true,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "oem",
+      "protocol_type" : "oem",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "9" : {
+    "name" : "RESERVED",
+    "is_valid" : false,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "reserved",
+      "protocol_type" : "na",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "10" : {
+    "name" : "RESERVED",
+    "is_valid" : false,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "reserved",
+      "protocol_type" : "na",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "11" : {
+    "name" : "RESERVED",
+    "is_valid" : false,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "reserved",
+      "protocol_type" : "na",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "12" : {
+    "name" : "RESERVED",
+    "is_valid" : false,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "reserved",
+      "protocol_type" : "na",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "13" : {
+    "name" : "RESERVED",
+    "is_valid" : false,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "reserved",
+      "protocol_type" : "na",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "14" : {
+    "name" : "SELF",
+    "is_valid" : false,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "ipmb",
+      "protocol_type" : "ipmb-1.0",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  },
+  "15" : {
+    "name" : "ipmi_ssif",
+    "is_valid" : true,
+    "active_sessions" : 0,
+    "channel_info" : {
+      "medium_type" : "smbus-v2.0",
+      "protocol_type" : "ipmi-smbus",
+      "session_supported" : "session-less",
+      "is_ipmi" : true
+    }
+  }
+}
diff --git a/meta-ampere/meta-mitchell/recipes-phosphor/ipmi/phosphor-ipmi-config/dev_id.json b/meta-ampere/meta-mitchell/recipes-phosphor/ipmi/phosphor-ipmi-config/dev_id.json
new file mode 100644
index 0000000..8e89732
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-phosphor/ipmi/phosphor-ipmi-config/dev_id.json
@@ -0,0 +1,2 @@
+{"id": 32, "revision": 1, "addn_dev_support": 141,
+    "manuf_id": 52538, "prod_id": 131, "aux": 0}
diff --git a/meta-ampere/meta-mitchell/recipes-phosphor/leds/ampere-led-manager-config-native.bb b/meta-ampere/meta-mitchell/recipes-phosphor/leds/ampere-led-manager-config-native.bb
new file mode 100644
index 0000000..3b15b53
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-phosphor/leds/ampere-led-manager-config-native.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Phosphor LED Group Management for Mt. Mitchell"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit native
+
+PROVIDES += "virtual/phosphor-led-manager-config-native"
+
+SRC_URI += "file://led.yaml"
+
+# Overwrite the example led layout yaml file prior
+# to building the phosphor-led-manager package
+do_install() {
+    DEST=${D}${datadir}/phosphor-led-manager
+    install -D ${WORKDIR}/led.yaml ${DEST}/led.yaml
+}
diff --git a/meta-ampere/meta-mitchell/recipes-phosphor/leds/ampere-led-manager-config/led.yaml b/meta-ampere/meta-mitchell/recipes-phosphor/leds/ampere-led-manager-config/led.yaml
new file mode 100644
index 0000000..3e321ed
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-phosphor/leds/ampere-led-manager-config/led.yaml
@@ -0,0 +1,32 @@
+bmc_booted:
+    power:
+        Action: 'Blink'
+        DutyOn: 50
+        Period: 1000
+        Priority: 'On'
+
+power_on:
+    power:
+        Action: 'On'
+        DutyOn: 50
+        Period: 0
+        Priority: 'On'
+
+systemFault:
+    fault:
+        Action: 'On'
+        DutyOn: 50
+        Period: 0
+        Priority: 'Blink'
+
+enclosure_identify:
+    identify:
+        Action: 'On'
+        DutyOn: 50
+        Period: 1000
+
+enclosure_identify_blink:
+    identify:
+        Action: 'Blink'
+        DutyOn: 50
+        Period: 1000
diff --git a/meta-ampere/meta-mitchell/recipes-phosphor/skeleton/obmc-libobmc-intf/mtmitchell_gpio_defs.json b/meta-ampere/meta-mitchell/recipes-phosphor/skeleton/obmc-libobmc-intf/mtmitchell_gpio_defs.json
new file mode 100644
index 0000000..f354284
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-phosphor/skeleton/obmc-libobmc-intf/mtmitchell_gpio_defs.json
@@ -0,0 +1,45 @@
+{
+    "gpio_configs": {
+
+        "power_config": {
+            "power_good_in": "PGOOD",
+            "power_up_outs": [
+                {"name": "OCP_MAIN_PWREN", "polarity": true},
+                {"name": "BMC_SYS_PSON_L", "polarity": false}
+            ]
+        }
+    },
+
+    "gpio_definitions": [
+        {
+            "name": "PGOOD",
+            "pin": "H3",
+            "direction": "in"
+        },
+        {
+            "name": "BMC_SYS_PSON_L",
+            "pin": "F2",
+            "direction": "out"
+        },
+        {
+            "name": "POWER_BUTTON",
+            "pin": "I6",
+            "direction": "both"
+        },
+        {
+            "name": "RESET_BUTTON",
+            "pin": "Z0",
+            "direction": "both"
+        },
+        {
+            "name": "OCP_MAIN_PWREN",
+            "pin": "W1",
+            "direction": "out"
+        },
+        {
+            "name": "ID_BTN",
+            "pin": "S2",
+            "direction": "both"
+        }
+    ]
+}
diff --git a/meta-ampere/meta-mitchell/recipes-phosphor/skeleton/obmc-libobmc-intf_%.bbappend b/meta-ampere/meta-mitchell/recipes-phosphor/skeleton/obmc-libobmc-intf_%.bbappend
new file mode 100644
index 0000000..331c244
--- /dev/null
+++ b/meta-ampere/meta-mitchell/recipes-phosphor/skeleton/obmc-libobmc-intf_%.bbappend
@@ -0,0 +1,10 @@
+FILESEXTRAPATHS:append := "${THISDIR}/${PN}:"
+
+SRC_URI += "\
+            file://${MACHINE}_gpio_defs.json \
+           "
+
+do_install:append() {
+	install -d ${D}${sysconfdir}/default/obmc/gpio/
+	install -m 0644 ${WORKDIR}/${MACHINE}_gpio_defs.json ${D}/${sysconfdir}/default/obmc/gpio/gpio_defs.json
+}