summaryrefslogtreecommitdiff
path: root/meta-quanta/meta-gbs/recipes-phosphor
diff options
context:
space:
mode:
Diffstat (limited to 'meta-quanta/meta-gbs/recipes-phosphor')
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config.bb31
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-fru-properties.yaml183
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-fru.yaml228
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-sensors.yaml1254
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/console/files/80-gbs-nuvoton-sol.rules1
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/console/files/obmc-console.conf1
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/console/obmc-console_%.bbappend13
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces/0024-Add-the-pre-timeout-interrupt-defined-in-IPMI-spec.patch57
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces/0025-Add-PreInterruptFlag-properity-in-DBUS.patch39
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces_%.bbappend5
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/config.json342
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service12
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-table-init.sh23
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service15
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control_%.bbappend31
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-0.conf6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-1.conf6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-2.conf6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-3.conf6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-4.conf6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-5.conf6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-6.conf6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-7.conf6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-8.conf6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-9.conf6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/phosphor-gpio-presence@.service.replace14
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor_%.bbappend32
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/host/phosphor-host-postd_%.bbappend2
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/images/obmc-phosphor-image.bbappend23
-rwxr-xr-xmeta-quanta/meta-gbs/recipes-phosphor/interfaces/bmcweb_%.bbappend3
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/inventory/inventory-cleanup.bb17
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/inventory/inventory-cleanup/inventory-cleanup.yaml16
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/inventory/phosphor-inventory-manager/associations.json487
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/inventory/phosphor-inventory-manager_%.bbappend9
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-blobs-binarystore/config.json5
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-blobs-binarystore_%.bbappend8
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config.bbappend1
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config/dev_id.json2
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config/entity-map.json28
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-flash_%.bbappend5
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/fan3
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/hsbp3
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/motherboard3
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru_%.bbappend26
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host/0063-Save-the-pre-timeout-interrupt-in-dbus-property.patch138
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host/gbs-ipmid-whitelist.conf79
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend18
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-kcs/99-ipmi-kcs.rules1
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-kcs_%.bbappend9
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/leds/gbs-led-manager-config-native.bb19
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/leds/gbs-led-manager-config/led.yaml239
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/network/phosphor-network_%.bbappend1
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/packagegroups/packagegroup-gbs-apps.bb36
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/packagegroups/packagegroup-obmc-apps%.bbappend2
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sel-logger/phosphor-sel-logger_%.bbappend5
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/0001-lev-add-poweron-monitor-feature.patch257
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/0002-lev-add-sensors-slow-readings.patch295
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@82000/sbtsi@4c.conf9
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@0/max31725@54.conf8
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@1/max31725@55.conf8
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@2/max31725@5d.conf8
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@88000/adm1272@10.conf43
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@0/vrm@60.conf46
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@1/vrm@61.conf46
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@2/vrm@63.conf46
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@3/vrm@45.conf46
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/max34451@4e.conf119
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/vrm@5d.conf50
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/vrm@5e.conf50
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/pwm-fan-controller@103000.conf44
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/iio-hwmon-battery.conf15
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon_%.bbappend35
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/nvme_config.json174
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/nvme_json_rewrite.sh214
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/xyz.openbmc_project.nvme.manager.service.replace19
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme_%.bbappend17
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager/restrictionmode-default-whitelist.override.yml6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager/time-default.override.yml6
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager_%.bbappend3
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/0001-Customize-phosphor-watchdog-for-Intel-platforms.patch313
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-watchdog.service16
-rw-r--r--meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog_%.bbappend7
83 files changed, 5435 insertions, 0 deletions
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config.bb b/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config.bb
new file mode 100644
index 000000000..cd632e132
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config.bb
@@ -0,0 +1,31 @@
+SUMMARY = "YAML configuration for gbs"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit allarch
+
+SRC_URI = " \
+ file://gbs-ipmi-fru.yaml \
+ file://gbs-ipmi-sensors.yaml \
+ file://gbs-ipmi-fru-properties.yaml \
+ "
+
+S = "${WORKDIR}"
+
+do_install() {
+ install -m 0644 -D gbs-ipmi-fru.yaml \
+ ${D}${datadir}/${BPN}/ipmi-fru-read.yaml
+ install -m 0644 -D gbs-ipmi-sensors.yaml \
+ ${D}${datadir}/${BPN}/ipmi-sensors.yaml
+ install -m 0644 -D gbs-ipmi-fru-properties.yaml \
+ ${D}${datadir}/${BPN}/ipmi-extra-properties.yaml
+}
+
+FILES_${PN}-dev = " \
+ ${datadir}/${BPN}/ipmi-fru-read.yaml \
+ ${datadir}/${BPN}/ipmi-sensors.yaml \
+ ${datadir}/${BPN}/ipmi-extra-properties.yaml \
+ "
+
+ALLOW_EMPTY_${PN} = "1"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-fru-properties.yaml b/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-fru-properties.yaml
new file mode 100644
index 000000000..2dce3030c
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-fru-properties.yaml
@@ -0,0 +1,183 @@
+/system/chassis/motherboard:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/hsbp:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/fan:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/PE0:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/PE0/PE0:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/PE1:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/PE1/PE1:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme0:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme1:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme2:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme3:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme4:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme5:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme6:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme7:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme8:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme9:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme10:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme11:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme12:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme13:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme14:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
+
+/system/chassis/motherboard/nvme15:
+ xyz.openbmc_project.Inventory.Decorator.Replaceable:
+ FieldReplaceable: 'true'
+ xyz.openbmc_project.Inventory.Decorator.Cacheable:
+ Cached: 'true'
+ xyz.openbmc_project.Inventory.Item:
+ Present: 'true'
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-fru.yaml b/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-fru.yaml
new file mode 100644
index 000000000..53cc486eb
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-fru.yaml
@@ -0,0 +1,228 @@
+0x00:
+ /system/chassis/motherboard:
+ entityID: 7
+ entityInstance: 0x00
+ interfaces:
+ xyz.openbmc_project.Inventory.Decorator.Asset:
+ BuildDate:
+ IPMIFruProperty: Mfg Date
+ IPMIFruSection: Board
+ Manufacturer:
+ IPMIFruProperty: Manufacturer
+ IPMIFruSection: Board
+ SerialNumber:
+ IPMIFruProperty: Serial Number
+ IPMIFruSection: Board
+ PartNumber:
+ IPMIFruProperty: Part Number
+ IPMIFruSection: Board
+ xyz.openbmc_project.Inventory.Item:
+ PrettyName:
+ IPMIFruProperty: Name
+ IPMIFruSection: Board
+ xyz.openbmc_project.Inventory.Decorator.Revision:
+ Version:
+ IPMIFruProperty: FRU File ID
+ IPMIFruSection: Board
+ xyz.openbmc_project.Inventory.Item.System:
+
+0x01:
+ /system/chassis/hsbp:
+ entityID: 7
+ entityInstance: 0x01
+ interfaces:
+ xyz.openbmc_project.Inventory.Decorator.Asset:
+ BuildDate:
+ IPMIFruProperty: Mfg Date
+ IPMIFruSection: Board
+ SerialNumber:
+ IPMIFruProperty: Serial Number
+ IPMIFruSection: Board
+ PartNumber:
+ IPMIFruProperty: Part Number
+ IPMIFruSection: Board
+ Manufacturer:
+ IPMIFruProperty: Manufacturer
+ IPMIFruSection: Board
+ xyz.openbmc_project.Inventory.Item:
+ PrettyName:
+ IPMIFruProperty: Name
+ IPMIFruSection: Board
+ xyz.openbmc_project.Inventory.Decorator.Revision:
+ Version:
+ IPMIFruProperty: FRU File ID
+ IPMIFruSection: Board
+
+0x02:
+ /system/chassis/fan:
+ entityID: 7
+ entityInstance: 0x02
+ interfaces:
+ xyz.openbmc_project.Inventory.Decorator.Asset:
+ BuildDate:
+ IPMIFruProperty: Mfg Date
+ IPMIFruSection: Board
+ SerialNumber:
+ IPMIFruProperty: Serial Number
+ IPMIFruSection: Board
+ PartNumber:
+ IPMIFruProperty: Part Number
+ IPMIFruSection: Board
+ Manufacturer:
+ IPMIFruProperty: Manufacturer
+ IPMIFruSection: Board
+ xyz.openbmc_project.Inventory.Item:
+ PrettyName:
+ IPMIFruProperty: Name
+ IPMIFruSection: Board
+ xyz.openbmc_project.Inventory.Decorator.Revision:
+ Version:
+ IPMIFruProperty: FRU File ID
+ IPMIFruSection: Board
+
+0x03:
+ /system/chassis/PE0: &ADD_IN_CARD_BOARD_DEFAULTS
+ entityID: 11
+ entityInstance: 0x00
+ interfaces:
+ xyz.openbmc_project.Inventory.Decorator.Asset:
+ BuildDate:
+ IPMIFruProperty: Mfg Date
+ IPMIFruSection: Board
+ SerialNumber:
+ IPMIFruProperty: Serial Number
+ IPMIFruSection: Board
+ PartNumber:
+ IPMIFruProperty: Part Number
+ IPMIFruSection: Board
+ Manufacturer:
+ IPMIFruProperty: Manufacturer
+ IPMIFruSection: Board
+ xyz.openbmc_project.Inventory.Item:
+ PrettyName:
+ IPMIFruProperty: Name
+ IPMIFruSection: Board
+ xyz.openbmc_project.Inventory.Decorator.Revision:
+ Version:
+ IPMIFruProperty: FRU File ID
+ IPMIFruSection: Board
+ /system/chassis/PE0/PE0: &ADD_IN_CARD_PRODUCT_DEFAULTS
+ entityID: 11
+ entityInstance: 0x00
+ interfaces:
+ xyz.openbmc_project.Inventory.Decorator.Asset:
+ BuildDate:
+ IPMIFruProperty: Mfg Date
+ IPMIFruSection: Product
+ SerialNumber:
+ IPMIFruProperty: Serial Number
+ IPMIFruSection: Product
+ Model:
+ IPMIFruProperty: Model Number
+ IPMIFruSection: Product
+ Manufacturer:
+ IPMIFruProperty: Manufacturer
+ IPMIFruSection: Product
+ xyz.openbmc_project.Inventory.Item:
+ PrettyName:
+ IPMIFruProperty: Name
+ IPMIFruSection: Product
+
+0x04:
+ /system/chassis/PE1:
+ entityInstance: 0x01
+ <<: *ADD_IN_CARD_BOARD_DEFAULTS
+ /system/chassis/PE1/PE1:
+ entityInstance: 0x01
+ <<: *ADD_IN_CARD_PRODUCT_DEFAULTS
+
+0x05:
+ /system/chassis/motherboard/nvme0: &NVME_BOARD_DEFAULTS
+ entityID: 4
+ entityInstance: 0x60
+ interfaces:
+ xyz.openbmc_project.Inventory.Decorator.Asset:
+ Manufacturer:
+ IPMIFruProperty: Manufacturer
+ IPMIFruSection: Product
+ SerialNumber:
+ IPMIFruProperty: Serial Number
+ IPMIFruSection: Product
+ Model:
+ IPMIFruProperty: Model Number
+ IPMIFruSection: Product
+
+0x06:
+ /system/chassis/motherboard/nvme1:
+ entityInstance: 0x61
+ <<: *NVME_BOARD_DEFAULTS
+
+0x07:
+ /system/chassis/motherboard/nvme2:
+ entityInstance: 0x62
+ <<: *NVME_BOARD_DEFAULTS
+
+0x08:
+ /system/chassis/motherboard/nvme3:
+ entityInstance: 0x63
+ <<: *NVME_BOARD_DEFAULTS
+
+0x09:
+ /system/chassis/motherboard/nvme4:
+ entityInstance: 0x64
+ <<: *NVME_BOARD_DEFAULTS
+
+0x0A:
+ /system/chassis/motherboard/nvme5:
+ entityInstance: 0x65
+ <<: *NVME_BOARD_DEFAULTS
+
+0x0B:
+ /system/chassis/motherboard/nvme6:
+ entityInstance: 0x66
+ <<: *NVME_BOARD_DEFAULTS
+
+0x0C:
+ /system/chassis/motherboard/nvme7:
+ entityInstance: 0x67
+ <<: *NVME_BOARD_DEFAULTS
+
+0x0D:
+ /system/chassis/motherboard/nvme8:
+ entityInstance: 0x68
+ <<: *NVME_BOARD_DEFAULTS
+
+0x0E:
+ /system/chassis/motherboard/nvme9:
+ entityInstance: 0x69
+ <<: *NVME_BOARD_DEFAULTS
+
+0x0F:
+ /system/chassis/motherboard/nvme10:
+ entityInstance: 0x6A
+ <<: *NVME_BOARD_DEFAULTS
+
+0x10:
+ /system/chassis/motherboard/nvme11:
+ entityInstance: 0x6B
+ <<: *NVME_BOARD_DEFAULTS
+
+0x11:
+ /system/chassis/motherboard/nvme12:
+ entityInstance: 0x6C
+ <<: *NVME_BOARD_DEFAULTS
+
+0x12:
+ /system/chassis/motherboard/nvme13:
+ entityInstance: 0x6D
+ <<: *NVME_BOARD_DEFAULTS
+
+0x13:
+ /system/chassis/motherboard/nvme14:
+ entityInstance: 0x6E
+ <<: *NVME_BOARD_DEFAULTS
+
+0x14:
+ /system/chassis/motherboard/nvme15:
+ entityInstance: 0x6F
+ <<: *NVME_BOARD_DEFAULTS
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-sensors.yaml b/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-sensors.yaml
new file mode 100644
index 000000000..929a566a2
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/configuration/gbs-yaml-config/gbs-ipmi-sensors.yaml
@@ -0,0 +1,1254 @@
+0x10: &temperature
+ entityID: 0x07
+ entityInstance: 0x1c
+ sensorType: 0x01
+ path: /xyz/openbmc_project/sensors/temperature/i2cool_0
+ sensorReadingType: 0x01
+ multiplierM: 1
+ offsetB: 0
+ bExp: 0
+ rExp: 0
+ unit: xyz.openbmc_project.Sensor.Value.Unit.DegreesC
+ mutability: Mutability::Write|Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: readingData
+ sensorUnits1: 0x80
+ interfaces:
+ xyz.openbmc_project.Sensor.Value:
+ Value:
+ Offsets:
+ 0xFF:
+ type: double
+
+0x11:
+ <<: *temperature
+ entityInstance: 0x1d
+ path: /xyz/openbmc_project/sensors/temperature/i2cool_1
+
+0x12:
+ <<: *temperature
+ entityInstance: 0x1e
+ path: /xyz/openbmc_project/sensors/temperature/i2cool_2
+
+0x13:
+ <<: *temperature
+ entityInstance: 0x1f
+ path: /xyz/openbmc_project/sensors/temperature/powerseq_temp
+
+0x14:
+ <<: *temperature
+ entityID: 0x03
+ entityInstance: 0x00
+ path: /xyz/openbmc_project/sensors/temperature/cputemp
+
+0x15: &nvme_temperature
+ entityID: 0x04
+ entityInstance: 0x00
+ sensorType: 0x01
+ path: /xyz/openbmc_project/sensors/temperature/nvme0
+ sensorReadingType: 0x01
+ mutability: Mutability::Write|Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: readingData
+ sensorNamePattern: nameLeaf
+ sensorUnits1: 0x80
+ unit: xyz.openbmc_project.Sensor.Value.Unit.DegreesC
+ interfaces:
+ xyz.openbmc_project.Sensor.Value:
+ Value:
+ Offsets:
+ 0xFF:
+ type: double
+
+0x16:
+ <<: *nvme_temperature
+ entityInstance: 0x01
+ path: /xyz/openbmc_project/sensors/temperature/nvme1
+
+0x17:
+ <<: *nvme_temperature
+ entityInstance: 0x02
+ path: /xyz/openbmc_project/sensors/temperature/nvme2
+
+0x18:
+ <<: *nvme_temperature
+ entityInstance: 0x03
+ path: /xyz/openbmc_project/sensors/temperature/nvme3
+
+0x19:
+ <<: *nvme_temperature
+ entityInstance: 0x04
+ path: /xyz/openbmc_project/sensors/temperature/nvme4
+
+0x1A:
+ <<: *nvme_temperature
+ entityInstance: 0x05
+ path: /xyz/openbmc_project/sensors/temperature/nvme5
+
+0x1B:
+ <<: *nvme_temperature
+ entityInstance: 0x06
+ path: /xyz/openbmc_project/sensors/temperature/nvme6
+
+0x1C:
+ <<: *nvme_temperature
+ entityInstance: 0x07
+ path: /xyz/openbmc_project/sensors/temperature/nvme7
+
+0x1D:
+ <<: *nvme_temperature
+ entityInstance: 0x08
+ path: /xyz/openbmc_project/sensors/temperature/nvme8
+
+0x1E:
+ <<: *nvme_temperature
+ entityInstance: 0x09
+ path: /xyz/openbmc_project/sensors/temperature/nvme9
+
+0x1F:
+ <<: *nvme_temperature
+ entityInstance: 0x0a
+ path: /xyz/openbmc_project/sensors/temperature/nvme10
+
+0x20:
+ <<: *nvme_temperature
+ entityInstance: 0x0b
+ path: /xyz/openbmc_project/sensors/temperature/nvme11
+
+0x21:
+ <<: *nvme_temperature
+ entityInstance: 0x0c
+ path: /xyz/openbmc_project/sensors/temperature/nvme12
+
+0x22:
+ <<: *nvme_temperature
+ entityInstance: 0x0d
+ path: /xyz/openbmc_project/sensors/temperature/nvme13
+
+0x23:
+ <<: *nvme_temperature
+ entityInstance: 0x0e
+ path: /xyz/openbmc_project/sensors/temperature/nvme14
+
+0x24:
+ <<: *nvme_temperature
+ entityInstance: 0x0f
+ path: /xyz/openbmc_project/sensors/temperature/nvme15
+
+# Virtual Sensors
+0x25:
+ <<: *temperature
+ entityID: 0x1E
+ entityInstance: 0x00
+ path: /xyz/openbmc_project/extsensors/margin/fleeting0
+
+0x26:
+ <<: *temperature
+ entityID: 0x1E
+ entityInstance: 0x01
+ path: /xyz/openbmc_project/extsensors/margin/fleeting1
+
+0x30: &voltage
+ entityID: 0x07
+ entityInstance: 0x00
+ sensorType: 0x02
+ path: /xyz/openbmc_project/sensors/voltage/p1v8_stby
+ sensorReadingType: 0x01
+ multiplierM: 78
+ offsetB: 0
+ bExp: 0
+ rExp: -4
+ unit: xyz.openbmc_project.Sensor.Value.Unit.Volts
+ mutability: Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: readingData
+ sensorNamePattern: nameLeaf
+ interfaces:
+ xyz.openbmc_project.Sensor.Value:
+ Value:
+ Offsets:
+ 0xFF:
+ type: double
+
+0x31:
+ <<: *voltage
+ entityInstance: 0x01
+ path: /xyz/openbmc_project/sensors/voltage/vddcr_soc_stby
+ multiplierM: 392
+ rExp: -5
+
+0x32:
+ <<: *voltage
+ entityInstance: 0x02
+ path: /xyz/openbmc_project/sensors/voltage/p2v5_stby
+ multiplierM: 118
+ rExp: -4
+
+0x33:
+ <<: *voltage
+ entityInstance: 0x03
+ path: /xyz/openbmc_project/sensors/voltage/p1v2_stby
+ multiplierM: 78
+ rExp: -4
+
+0x34:
+ <<: *voltage
+ entityInstance: 0x04
+ path: /xyz/openbmc_project/sensors/voltage/p1v175_stby
+ multiplierM: 78
+ rExp: -4
+
+0x35:
+ <<: *voltage
+ entityInstance: 0x05
+ path: /xyz/openbmc_project/sensors/voltage/p1v8
+ multiplierM: 78
+ rExp: -4
+
+0x36:
+ <<: *voltage
+ entityInstance: 0x06
+ path: /xyz/openbmc_project/sensors/voltage/p3v3
+ multiplierM: 157
+ rExp: -4
+
+0x37:
+ <<: *voltage
+ entityInstance: 0x07
+ path: /xyz/openbmc_project/sensors/voltage/pwrgd_pvpp
+ multiplierM: 235
+ rExp: -4
+
+0x38:
+ <<: *voltage
+ entityInstance: 0x08
+ path: /xyz/openbmc_project/sensors/voltage/pwrgd_pvddio
+ multiplierM: 235
+ rExp: -4
+
+0x39:
+ <<: *voltage
+ entityInstance: 0x09
+ path: /xyz/openbmc_project/sensors/voltage/pwrgd_cpuvr
+ multiplierM: 235
+ rExp: -4
+
+0x3A:
+ <<: *voltage
+ entityInstance: 0x0a
+ path: /xyz/openbmc_project/sensors/voltage/p3v3_stby
+ multiplierM: 157
+ rExp: -4
+
+0x3B:
+ <<: *voltage
+ entityInstance: 0x0b
+ path: /xyz/openbmc_project/sensors/voltage/p5v_stby
+ multiplierM: 235
+ rExp: -4
+
+# ADC sensor
+0x46:
+ <<: *voltage
+ entityID: 0x28
+ entityInstance: 0
+ path: /xyz/openbmc_project/sensors/voltage/p3v_bat_adc
+ multiplierM: 157
+ offsetB: 0
+ bExp: 0
+ rExp: -4
+
+# VRM sensors
+# PVDDCR_CPU
+# VRM input voltage for various rails are around 13.5V. Use the same config.
+0x3C: &voltage_13v5_in
+ entityID: 0x07
+ sensorType: 0x02
+ entityInstance: 0x0c
+ path: /xyz/openbmc_project/sensors/voltage/vddcr_cpu_in
+ sensorReadingType: 0x01
+ multiplierM: 55
+ offsetB: 0
+ bExp: 0
+ unit: xyz.openbmc_project.Sensor.Value.Unit.Volts
+ rExp: -3
+ mutability: Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: readingData
+ interfaces:
+ xyz.openbmc_project.Sensor.Value:
+ Value:
+ Offsets:
+ 0xFF:
+ type: double
+
+0x3D:
+ <<: *voltage
+ entityInstance: 0x0d
+ path: /xyz/openbmc_project/sensors/voltage/vddcr_cpu_out
+ multiplierM: 78
+ rExp: -4
+
+0x50: &current
+ entityID: 0x07
+ entityInstance: 0x14
+ sensorType: 0x03
+ path: /xyz/openbmc_project/sensors/current/vddcr_cpu_in
+ sensorReadingType: 0x01
+ multiplierM: 86
+ rExp: -3
+ unit: xyz.openbmc_project.Sensor.Value.Unit.Amperes
+ mutability: Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: readingData
+ sensorNamePattern: nameLeaf
+ interfaces:
+ xyz.openbmc_project.Sensor.Value:
+ Value:
+ Offsets:
+ 0xFF:
+ type: double
+
+0x51:
+ <<: *current
+ entityInstance: 0x15
+ path: /xyz/openbmc_project/sensors/current/vddcr_cpu_out
+ multiplierM: 1
+ rExp: 0
+
+0x27:
+ <<: *temperature
+ entityInstance: 0x28
+ path: /xyz/openbmc_project/sensors/temperature/vddcr_cpu
+
+# PVDDCR_SOC0
+0x3E:
+ <<: *voltage_13v5_in
+ entityInstance: 0x0e
+ path: /xyz/openbmc_project/sensors/voltage/vddcr_soc_in
+ multiplierM: 55
+ rExp: -3
+
+0x3F:
+ <<: *voltage
+ entityInstance: 0x0f
+ path: /xyz/openbmc_project/sensors/voltage/vddcr_soc_out
+ multiplierM: 78
+ rExp: -4
+
+0x52:
+ <<: *current
+ entityInstance: 0x16
+ path: /xyz/openbmc_project/sensors/current/vddcr_soc_in
+ multiplierM: 353
+ rExp: -4
+
+0x53:
+ <<: *current
+ entityInstance: 0x17
+ path: /xyz/openbmc_project/sensors/current/vddcr_soc_out
+ multiplierM: 345
+ rExp: -3
+
+0x28:
+ <<: *temperature
+ entityInstance: 0x29
+ path: /xyz/openbmc_project/sensors/temperature/vddcr_soc
+
+# PVDDIO_ABCD
+0x40:
+ <<: *voltage
+ entityInstance: 0x10
+ path: /xyz/openbmc_project/sensors/voltage/vddio_abcd_out
+ multiplierM: 78
+ rExp: -4
+
+0x41:
+ <<: *voltage_13v5_in
+ entityInstance: 0x11
+ path: /xyz/openbmc_project/sensors/voltage/vddio_abcd_in
+ multiplierM: 55
+ rExp: -3
+
+0x55:
+ <<: *current
+ entityInstance: 0x19
+ path: /xyz/openbmc_project/sensors/current/vddio_abcd_in
+ multiplierM: 353
+ rExp: -4
+
+0x54:
+ <<: *current
+ entityInstance: 0x18
+ path: /xyz/openbmc_project/sensors/current/vddio_abcd_out
+ multiplierM: 345
+ rExp: -3
+
+0x29:
+ <<: *temperature
+ entityInstance: 0x2a
+ path: /xyz/openbmc_project/sensors/temperature/vddio_abcd
+
+# PVDDIO_EFGH
+0x42:
+ <<: *voltage
+ entityInstance: 0x12
+ path: /xyz/openbmc_project/sensors/voltage/vddio_efgh_out
+ multiplierM: 78
+ rExp: -4
+
+0x43:
+ <<: *voltage_13v5_in
+ entityInstance: 0x13
+ path: /xyz/openbmc_project/sensors/voltage/vddio_efgh_in
+ multiplierM: 55
+ rExp: -3
+
+0x57:
+ <<: *current
+ entityInstance: 0x1b
+ path: /xyz/openbmc_project/sensors/current/vddio_efgh_in
+ multiplierM: 353
+ rExp: -4
+
+0x56:
+ <<: *current
+ entityInstance: 0x1a
+ path: /xyz/openbmc_project/sensors/current/vddio_efgh_out
+ multiplierM: 345
+ rExp: -3
+
+0x2A:
+ <<: *temperature
+ entityInstance: 0x2b
+ path: /xyz/openbmc_project/sensors/temperature/vddio_efgh
+
+# P12V_1
+0x47:
+ <<: *voltage
+ entityInstance: 0x20
+ path: /xyz/openbmc_project/sensors/voltage/p12v_mobo_out
+ multiplierM: 55
+ rExp: -3
+
+0x48:
+ <<: *voltage_13v5_in
+ entityInstance: 0x21
+ path: /xyz/openbmc_project/sensors/voltage/p12v_mobo_in
+ multiplierM: 255
+ rExp: -3
+
+0x5A:
+ <<: *current
+ entityInstance: 0x25
+ path: /xyz/openbmc_project/sensors/current/p12v_mobo_in
+ multiplierM: 137
+ rExp: -3
+
+0x59:
+ <<: *current
+ entityInstance: 0x24
+ path: /xyz/openbmc_project/sensors/current/p12v_mobo_out
+ multiplierM: 59
+ rExp: -2
+
+0x2B:
+ <<: *temperature
+ entityInstance: 0x2c
+ path: /xyz/openbmc_project/sensors/temperature/p12v_mobo
+
+# P12V_2
+0x49:
+ <<: *voltage
+ entityInstance: 0x22
+ path: /xyz/openbmc_project/sensors/voltage/p12v_fan_out
+ multiplierM: 55
+ rExp: -3
+
+0x4A:
+ <<: *voltage_13v5_in
+ entityInstance: 0x23
+ path: /xyz/openbmc_project/sensors/voltage/p12v_fan_in
+ multiplierM: 255
+ rExp: -3
+
+0x5C:
+ <<: *current
+ entityInstance: 0x27
+ path: /xyz/openbmc_project/sensors/current/p12v_fan_in
+ multiplierM: 137
+ rExp: -3
+
+0x5B:
+ <<: *current
+ entityInstance: 0x26
+ path: /xyz/openbmc_project/sensors/current/p12v_fan_out
+ multiplierM: 59
+ rExp: -2
+
+0x2C:
+ <<: *temperature
+ entityInstance: 0x2d
+ path: /xyz/openbmc_project/sensors/temperature/p12v_fan
+
+# Hotswap controller
+0x44:
+ <<: *voltage
+ entityID: 0x0E
+ entityInstance: 0x00
+ path: /xyz/openbmc_project/sensors/voltage/hotswap_vin
+ multiplierM: 259
+ rExp: -3
+
+0x45:
+ <<: *voltage
+ entityID: 0x0E
+ entityInstance: 0x01
+ path: /xyz/openbmc_project/sensors/voltage/hotswap_vout
+ multiplierM: 259
+ rExp: -3
+
+0x58:
+ <<: *current
+ entityID: 0x0E
+ entityInstance: 0x02
+ path: /xyz/openbmc_project/sensors/current/hotswap_iout
+ multiplierM: 216
+ rExp: -3
+
+0x70:
+ entityID: 0x0E
+ entityInstance: 0x03
+ sensorType: 0x0B
+ path: /xyz/openbmc_project/sensors/power/hotswap_pout
+ sensorReadingType: 0x01
+ multiplierM: 86
+ offsetB: 0
+ bExp: 0
+ rExp: -1
+ unit: xyz.openbmc_project.Sensor.Value.Unit.Watts
+ mutability: Mutability::Write|Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: readingData
+ sensorNamePattern: nameLeaf
+ interfaces:
+ xyz.openbmc_project.Sensor.Value:
+ Value:
+ Offsets:
+ 0xFF:
+ type: double
+
+0x2D:
+ <<: *temperature
+ entityInstance: 0x2e
+ path: /xyz/openbmc_project/sensors/temperature/hotswap
+
+# fan/pwm mapping
+# fan0/1 on Mobo, fb_fan0/1/2 on fan board
+# PWM0 => fan tach 0
+# PWM1 => fan tach 1
+# PWM2 => fan tach 2
+# PWM3 => fan tach 3
+# PWM4 => fan tach 4
+0x60: &fan_rpm_read
+ entityID: 0x1D
+ entityInstance: 0x00
+ sensorType: 0x04
+ path: /xyz/openbmc_project/sensors/fan_tach/fan0
+ sensorReadingType: 0x01
+ multiplierM: 81
+ offsetB: 0
+ bExp: 0
+ rExp: 0
+ unit: xyz.openbmc_project.Sensor.Value.Unit.RPMS
+ mutability: Mutability::Write|Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: readingData
+ sensorNamePattern: nameLeaf
+ interfaces:
+ xyz.openbmc_project.Sensor.Value:
+ Value:
+ Offsets:
+ 0xFF:
+ type: double
+
+0x61:
+ <<: *fan_rpm_read
+ entityInstance: 0x01
+ path: /xyz/openbmc_project/sensors/fan_tach/fan1
+
+0x62:
+ <<: *fan_rpm_read
+ entityInstance: 0x02
+ path: /xyz/openbmc_project/sensors/fan_tach/fb_fan0
+
+0x63:
+ <<: *fan_rpm_read
+ entityInstance: 0x03
+ path: /xyz/openbmc_project/sensors/fan_tach/fb_fan1
+
+0x64:
+ <<: *fan_rpm_read
+ entityInstance: 0x04
+ path: /xyz/openbmc_project/sensors/fan_tach/fb_fan2
+
+0x65: &fan_pwm
+ entityID: 0x1D
+ sensorType: 0x04
+ entityInstance: 0x05
+ path: /xyz/openbmc_project/sensors/fan_tach/fan0
+ sensorReadingType: 0x01
+ multiplierM: 1
+ offsetB: 0
+ bExp: 0
+ mutability: Mutability::Write
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: readingData
+ interfaces:
+ xyz.openbmc_project.Control.FanPwm:
+ Target:
+ Offsets:
+ 0xFF:
+ type: uint64_t
+
+0x66:
+ <<: *fan_pwm
+ entityInstance: 0x06
+ path: /xyz/openbmc_project/sensors/fan_tach/fan1
+
+0x67:
+ <<: *fan_pwm
+ entityInstance: 0x07
+ path: /xyz/openbmc_project/sensors/fan_tach/fb_fan0
+
+0x68:
+ <<: *fan_pwm
+ entityInstance: 0x08
+ path: /xyz/openbmc_project/sensors/fan_tach/fb_fan1
+
+0x69:
+ <<: *fan_pwm
+ entityInstance: 0x09
+ path: /xyz/openbmc_project/sensors/fan_tach/fb_fan2
+
+# NVME SSD locate/fault LEDs
+0x71: &locateled
+ entityID: 0x04
+ entityInstance: 0x10
+ sensorType: 0x21
+ path: /xyz/openbmc_project/led/groups/led_u2_0_locate
+ sensorReadingType: 0x6F
+ mutability: Mutability::Write|Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: assertion
+ sensorNamePattern: nameLeaf
+ interfaces:
+ xyz.openbmc_project.Led.Group:
+ Asserted:
+ Offsets:
+ 0x01:
+ type: bool
+ assert: true
+
+0x72:
+ <<: *locateled
+ entityInstance: 0x11
+ path: /xyz/openbmc_project/led/groups/led_u2_1_locate
+
+0x73:
+ <<: *locateled
+ entityInstance: 0x12
+ path: /xyz/openbmc_project/led/groups/led_u2_2_locate
+
+0x74:
+ <<: *locateled
+ entityInstance: 0x13
+ path: /xyz/openbmc_project/led/groups/led_u2_3_locate
+
+0x75:
+ <<: *locateled
+ entityInstance: 0x14
+ path: /xyz/openbmc_project/led/groups/led_u2_4_locate
+
+0x76:
+ <<: *locateled
+ entityInstance: 0x15
+ path: /xyz/openbmc_project/led/groups/led_u2_5_locate
+
+0x77:
+ <<: *locateled
+ entityInstance: 0x16
+ path: /xyz/openbmc_project/led/groups/led_u2_6_locate
+
+0x78:
+ <<: *locateled
+ entityInstance: 0x17
+ path: /xyz/openbmc_project/led/groups/led_u2_7_locate
+
+0x79:
+ <<: *locateled
+ entityInstance: 0x18
+ path: /xyz/openbmc_project/led/groups/led_u2_8_locate
+
+0x7A:
+ <<: *locateled
+ entityInstance: 0x19
+ path: /xyz/openbmc_project/led/groups/led_u2_9_locate
+
+0x7B:
+ <<: *locateled
+ entityInstance: 0x1a
+ path: /xyz/openbmc_project/led/groups/led_u2_10_locate
+
+0x7C:
+ <<: *locateled
+ entityInstance: 0x1b
+ path: /xyz/openbmc_project/led/groups/led_u2_11_locate
+
+0x7D:
+ <<: *locateled
+ entityInstance: 0x1c
+ path: /xyz/openbmc_project/led/groups/led_u2_12_locate
+
+0x7E:
+ <<: *locateled
+ entityInstance: 0x1d
+ path: /xyz/openbmc_project/led/groups/led_u2_13_locate
+
+0x7F:
+ <<: *locateled
+ entityInstance: 0x1e
+ path: /xyz/openbmc_project/led/groups/led_u2_14_locate
+
+0x80:
+ <<: *locateled
+ entityInstance: 0x1f
+ path: /xyz/openbmc_project/led/groups/led_u2_15_locate
+
+0x81: &faultled
+ entityID: 0x04
+ entityInstance: 0x20
+ sensorType: 0x21
+ path: /xyz/openbmc_project/led/groups/led_u2_0_fault
+ sensorReadingType: 0x6F
+ mutability: Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: assertion
+ sensorNamePattern: nameLeaf
+ interfaces:
+ xyz.openbmc_project.Led.Group:
+ Asserted:
+ Offsets:
+ 0x00:
+ type: bool
+ assert: true
+
+0x82:
+ <<: *faultled
+ entityInstance: 0x21
+ path: /xyz/openbmc_project/led/groups/led_u2_1_fault
+
+0x83:
+ <<: *faultled
+ entityInstance: 0x22
+ path: /xyz/openbmc_project/led/groups/led_u2_2_fault
+
+0x84:
+ <<: *faultled
+ entityInstance: 0x23
+ path: /xyz/openbmc_project/led/groups/led_u2_3_fault
+
+0x85:
+ <<: *faultled
+ entityInstance: 0x24
+ path: /xyz/openbmc_project/led/groups/led_u2_4_fault
+
+0x86:
+ <<: *faultled
+ entityInstance: 0x25
+ path: /xyz/openbmc_project/led/groups/led_u2_5_fault
+
+0x87:
+ <<: *faultled
+ entityInstance: 0x26
+ path: /xyz/openbmc_project/led/groups/led_u2_6_fault
+
+0x88:
+ <<: *faultled
+ entityInstance: 0x27
+ path: /xyz/openbmc_project/led/groups/led_u2_7_fault
+
+0x89:
+ <<: *faultled
+ entityInstance: 0x28
+ path: /xyz/openbmc_project/led/groups/led_u2_8_fault
+
+0x8A:
+ <<: *faultled
+ entityInstance: 0x29
+ path: /xyz/openbmc_project/led/groups/led_u2_9_fault
+
+0x8B:
+ <<: *faultled
+ entityInstance: 0x2a
+ path: /xyz/openbmc_project/led/groups/led_u2_10_fault
+
+0x8C:
+ <<: *faultled
+ entityInstance: 0x2b
+ path: /xyz/openbmc_project/led/groups/led_u2_11_fault
+
+0x8D:
+ <<: *faultled
+ entityInstance: 0x2c
+ path: /xyz/openbmc_project/led/groups/led_u2_12_fault
+
+0x8E:
+ <<: *faultled
+ entityInstance: 0x2d
+ path: /xyz/openbmc_project/led/groups/led_u2_13_fault
+
+0x8F:
+ <<: *faultled
+ entityInstance: 0x2e
+ path: /xyz/openbmc_project/led/groups/led_u2_14_fault
+
+0x90:
+ <<: *faultled
+ entityInstance: 0x2f
+ path: /xyz/openbmc_project/led/groups/led_u2_15_fault
+
+# NVME SSD presence
+0xB0: &present
+ entityID: 0x04
+ entityInstance: 0x30
+ sensorType: 0x25
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme0
+ sensorReadingType: 0x6F
+ mutability: Mutability::Write|Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: assertion
+ sensorNamePattern: nameLeaf
+ interfaces:
+ xyz.openbmc_project.Inventory.Item:
+ Present:
+ Offsets:
+ 0x00:
+ assert: true
+ type: bool
+ 0x01:
+ assert: false
+ type: bool
+
+0xB1:
+ <<: *present
+ entityInstance: 0x31
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme1
+
+0xB2:
+ <<: *present
+ entityInstance: 0x32
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme2
+
+0xB3:
+ <<: *present
+ entityInstance: 0x33
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme3
+
+0xB4:
+ <<: *present
+ entityInstance: 0x34
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme4
+
+0xB5:
+ <<: *present
+ entityInstance: 0x35
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme5
+
+0xB6:
+ <<: *present
+ entityInstance: 0x36
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme6
+
+0xB7:
+ <<: *present
+ entityInstance: 0x37
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme7
+
+0xB8:
+ <<: *present
+ entityInstance: 0x38
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme8
+
+0xB9:
+ <<: *present
+ entityInstance: 0x39
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme9
+
+0xBA:
+ <<: *present
+ entityInstance: 0x3a
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme10
+
+0xBB:
+ <<: *present
+ entityInstance: 0x3b
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme11
+
+0xBC:
+ <<: *present
+ entityInstance: 0x3c
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme12
+
+0xBD:
+ <<: *present
+ entityInstance: 0x3d
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme13
+
+0xBE:
+ <<: *present
+ entityInstance: 0x3e
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme14
+
+0xBF:
+ <<: *present
+ entityInstance: 0x3f
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/nvme15
+
+0xC0: &nvme_pwrdis
+ entityID: 0x04
+ entityInstance: 0x40
+ sensorType: 0x21
+ path: /xyz/openbmc_project/control/nvme/u2_0_pwr_dis
+ sensorReadingType: 0x6F
+ mutability: Mutability::Write|Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: assertion
+ sensorNamePattern: nameLeaf
+ interfaces:
+ xyz.openbmc_project.Control.Nvme.Power:
+ Asserted:
+ Offsets:
+ 0x08:
+ type: string
+ assert: xyz.openbmc_project.Control.Nvme.Power.SlotDisabled
+ deassert: xyz.openbmc_project.Control.Nvme.Power.SlotEnabled
+
+0xC1:
+ <<: *nvme_pwrdis
+ entityInstance: 0x41
+ path: /xyz/openbmc_project/control/nvme/u2_1_pwr_dis
+
+0xC2:
+ <<: *nvme_pwrdis
+ entityInstance: 0x42
+ path: /xyz/openbmc_project/control/nvme/u2_2_pwr_dis
+
+0xC3:
+ <<: *nvme_pwrdis
+ entityInstance: 0x43
+ path: /xyz/openbmc_project/control/nvme/u2_3_pwr_dis
+
+0xC4:
+ <<: *nvme_pwrdis
+ entityInstance: 0x44
+ path: /xyz/openbmc_project/control/nvme/u2_4_pwr_dis
+
+0xC5:
+ <<: *nvme_pwrdis
+ entityInstance: 0x45
+ path: /xyz/openbmc_project/control/nvme/u2_5_pwr_dis
+
+0xC6:
+ <<: *nvme_pwrdis
+ entityInstance: 0x46
+ path: /xyz/openbmc_project/control/nvme/u2_6_pwr_dis
+
+0xC7:
+ <<: *nvme_pwrdis
+ entityInstance: 0x47
+ path: /xyz/openbmc_project/control/nvme/u2_7_pwr_dis
+
+0xC8:
+ <<: *nvme_pwrdis
+ entityInstance: 0x48
+ path: /xyz/openbmc_project/control/nvme/u2_8_pwr_dis
+
+0xC9:
+ <<: *nvme_pwrdis
+ entityInstance: 0x49
+ path: /xyz/openbmc_project/control/nvme/u2_9_pwr_dis
+
+0xCA:
+ <<: *nvme_pwrdis
+ entityInstance: 0x4A
+ path: /xyz/openbmc_project/control/nvme/u2_10_pwr_dis
+
+0xCB:
+ <<: *nvme_pwrdis
+ entityInstance: 0x4B
+ path: /xyz/openbmc_project/control/nvme/u2_11_pwr_dis
+
+0xCC:
+ <<: *nvme_pwrdis
+ entityInstance: 0x4C
+ path: /xyz/openbmc_project/control/nvme/u2_12_pwr_dis
+
+0xCD:
+ <<: *nvme_pwrdis
+ entityInstance: 0x4D
+ path: /xyz/openbmc_project/control/nvme/u2_13_pwr_dis
+
+0xCE:
+ <<: *nvme_pwrdis
+ entityInstance: 0x4E
+ path: /xyz/openbmc_project/control/nvme/u2_14_pwr_dis
+
+0xCF:
+ <<: *nvme_pwrdis
+ entityInstance: 0x4F
+ path: /xyz/openbmc_project/control/nvme/u2_15_pwr_dis
+
+0xD0: &nvme_pwren
+ entityID: 0x04
+ entityInstance: 0x50
+ sensorType: 0x21
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_0_en
+ sensorReadingType: 0x6F
+ mutability: Mutability::Write|Mutability::Read
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: assertion
+ sensorNamePattern: nameLeaf
+ interfaces:
+ xyz.openbmc_project.Control.Nvme.Power:
+ Asserted:
+ Offsets:
+ 0x05:
+ type: string
+ assert: xyz.openbmc_project.Control.Nvme.Power.Off
+ deassert: xyz.openbmc_project.Control.Nvme.Power.On
+
+0xD1:
+ <<: *nvme_pwren
+ entityInstance: 0x51
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_1_en
+
+0xD2:
+ <<: *nvme_pwren
+ entityInstance: 0x52
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_2_en
+
+0xD3:
+ <<: *nvme_pwren
+ entityInstance: 0x53
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_3_en
+
+0xD4:
+ <<: *nvme_pwren
+ entityInstance: 0x54
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_4_en
+
+0xD5:
+ <<: *nvme_pwren
+ entityInstance: 0x55
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_5_en
+
+0xD6:
+ <<: *nvme_pwren
+ entityInstance: 0x56
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_6_en
+
+0xD7:
+ <<: *nvme_pwren
+ entityInstance: 0x57
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_7_en
+
+0xD8:
+ <<: *nvme_pwren
+ entityInstance: 0x58
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_8_en
+
+0xD9:
+ <<: *nvme_pwren
+ entityInstance: 0x59
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_9_en
+
+0xDA:
+ <<: *nvme_pwren
+ entityInstance: 0x5A
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_10_en
+
+0xDB:
+ <<: *nvme_pwren
+ entityInstance: 0x5B
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_11_en
+
+0xDC:
+ <<: *nvme_pwren
+ entityInstance: 0x5C
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_12_en
+
+0xDD:
+ <<: *nvme_pwren
+ entityInstance: 0x5D
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_13_en
+
+0xDE:
+ <<: *nvme_pwren
+ entityInstance: 0x5E
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_14_en
+
+0xDF:
+ <<: *nvme_pwren
+ entityInstance: 0x5F
+ path: /xyz/openbmc_project/control/nvme/pwr_u2_15_en
+
+0xF0:
+ entityID: 0x20
+ entityInstance: 0
+ sensorType: 0x0C
+ path: /xyz/openbmc_project/metrics/memory/BmcECC
+ sensorReadingType: 0x6F
+ serviceInterface: org.freedesktop.DBus.Properties
+ readingType: assertion
+ mutability: Mutability::Read
+ sensorNamePattern: nameLeaf
+ interfaces:
+ xyz.openbmc_project.Memory.MemoryECC:
+ state:
+ Offsets:
+ 0x00:
+ type: string
+ assert: xyz.openbmc_project.Memory.MemoryECC.ECCStatus.CE
+ 0x01:
+ type: string
+ assert: xyz.openbmc_project.Memory.MemoryECC.ECCStatus.UE
+ 0x05:
+ type: string
+ assert: xyz.openbmc_project.Memory.MemoryECC.ECCStatus.LogFull
+
+#GPIO present connection
+0xF1: &gpio_prsnt
+ entityID: 0x1F
+ entityInstance: 0
+ interfaces:
+ xyz.openbmc_project.Inventory.Item:
+ Present:
+ Offsets:
+ 0x00:
+ assert: true
+ type: bool
+ 0x01:
+ assert: false
+ type: bool
+ mutability: Mutability::Write|Mutability::Read
+ path: /xyz/openbmc_project/inventory/system/chassis/cable/ss_cab0_prsnt
+ readingType: assertion
+ sensorNamePattern: nameLeaf
+ sensorReadingType: 0x6f
+ sensorType: 0x1B
+ serviceInterface: org.freedesktop.DBus.Properties
+
+0xF2:
+ <<: *gpio_prsnt
+ entityInstance: 1
+ path: /xyz/openbmc_project/inventory/system/chassis/cable/ss_cab1_prsnt
+
+0xF3:
+ <<: *gpio_prsnt
+ entityInstance: 2
+ path: /xyz/openbmc_project/inventory/system/chassis/cable/ss_cab2_prsnt
+
+0xF4:
+ <<: *gpio_prsnt
+ entityInstance: 3
+ path: /xyz/openbmc_project/inventory/system/chassis/cable/ss_cab3_prsnt
+
+0xF5:
+ entityID: 0x1A
+ entityInstance: 0
+ interfaces:
+ xyz.openbmc_project.Inventory.Item:
+ Present:
+ Offsets:
+ 0x00:
+ assert: true
+ type: bool
+ 0x01:
+ assert: false
+ type: bool
+ mutability: Mutability::Write|Mutability::Read
+ path: /xyz/openbmc_project/inventory/system/chassis/entity/sata0_prsnt
+ readingType: assertion
+ sensorNamePattern: nameLeaf
+ sensorReadingType: 0x6f
+ sensorType: 0x25
+ serviceInterface: org.freedesktop.DBus.Properties
+
+0xF6:
+ <<: *gpio_prsnt
+ entityInstance: 4
+ path: /xyz/openbmc_project/inventory/system/chassis/cable/hsbp_cab_prsnt
+
+0xF7:
+ <<: *gpio_prsnt
+ entityInstance: 5
+ path: /xyz/openbmc_project/inventory/system/chassis/cable/fanbd_cab_prsnt
+
+0xF8:
+ <<: *gpio_prsnt
+ entityInstance: 6
+ path: /xyz/openbmc_project/inventory/system/chassis/cable/bp12v_cab_prsnt
+
+0xF9: &card_prsnt
+ entityID: 0x0B
+ entityInstance: 0
+ interfaces:
+ xyz.openbmc_project.Inventory.Item:
+ Present:
+ Offsets:
+ 0x00:
+ assert: true
+ type: bool
+ 0x01:
+ assert: false
+ type: bool
+ mutability: Mutability::Write|Mutability::Read
+ path: /xyz/openbmc_project/inventory/system/chassis/entity/pe_slot0_prsnt
+ readingType: assertion
+ sensorNamePattern: nameLeaf
+ sensorReadingType: 0x6f
+ sensorType: 0x25
+ serviceInterface: org.freedesktop.DBus.Properties
+
+0xFA:
+ <<: *card_prsnt
+ entityInstance: 1
+ path: /xyz/openbmc_project/inventory/system/chassis/entity/pe_slot1_prsnt
+
+0xFB:
+ entityID: 0x21
+ entityInstance: 0
+ interfaces:
+ xyz.openbmc_project.State.Watchdog:
+ ExpireAction:
+ Offsets:
+ 0x00:
+ assert: xyz.openbmc_project.State.Watchdog.Action.None
+ type: string
+ 0x01:
+ assert: xyz.openbmc_project.State.Watchdog.Action.HardReset
+ type: string
+ 0x02:
+ assert: xyz.openbmc_project.State.Watchdog.Action.PowerOff
+ type: string
+ 0x03:
+ assert: xyz.openbmc_project.State.Watchdog.Action.PowerCycle
+ type: string
+ mutability: Mutability::Write|Mutability::Read
+ path: /xyz/openbmc_project/watchdog/host0
+ readingType: assertion
+ sensorNamePattern: nameLeaf
+ sensorReadingType: 0x6F
+ sensorType: 0x23
+ serviceInterface: org.freedesktop.DBus.Properties
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/console/files/80-gbs-nuvoton-sol.rules b/meta-quanta/meta-gbs/recipes-phosphor/console/files/80-gbs-nuvoton-sol.rules
new file mode 100644
index 000000000..3d0670bc3
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/console/files/80-gbs-nuvoton-sol.rules
@@ -0,0 +1 @@
+SUBSYSTEM=="tty", ATTRS{iomem_base}=="0xF0002000", ENV{SYSTEMD_WANTS}="obmc-console@ttyS1" SYMLINK+="ttyS1", TAG+="systemd"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/console/files/obmc-console.conf b/meta-quanta/meta-gbs/recipes-phosphor/console/files/obmc-console.conf
new file mode 100644
index 000000000..666e66aac
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/console/files/obmc-console.conf
@@ -0,0 +1 @@
+baud = 115200
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/console/obmc-console_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/console/obmc-console_%.bbappend
new file mode 100644
index 000000000..f78e3c22d
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/console/obmc-console_%.bbappend
@@ -0,0 +1,13 @@
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/files:"
+SRC_URI_append_gbs = " file://80-gbs-nuvoton-sol.rules"
+
+do_install_append_gbs() {
+ install -m 0755 -d ${D}${sysconfdir}/${BPN}
+ rm -f ${D}${sysconfdir}/${BPN}/server.ttyVUART0.conf
+ install -m 0644 ${WORKDIR}/${BPN}.conf ${D}${sysconfdir}/
+ ln -sr ${D}${sysconfdir}/${BPN}.conf ${D}${sysconfdir}/${BPN}/server.ttyS1.conf
+
+ install -d ${D}/lib/udev/rules.d
+ rm -f ${D}/lib/udev/rules.d/80-obmc-console-uart.rules
+ install -m 0644 ${WORKDIR}/80-gbs-nuvoton-sol.rules ${D}/lib/udev/rules.d
+}
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces/0024-Add-the-pre-timeout-interrupt-defined-in-IPMI-spec.patch b/meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces/0024-Add-the-pre-timeout-interrupt-defined-in-IPMI-spec.patch
new file mode 100644
index 000000000..67fa59090
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces/0024-Add-the-pre-timeout-interrupt-defined-in-IPMI-spec.patch
@@ -0,0 +1,57 @@
+From 6e9a19c43acac7d4254910906329d98d7b59085a Mon Sep 17 00:00:00 2001
+From: Ren Yu <yux.ren@intel.com>
+Date: Fri, 24 May 2019 14:55:10 +0800
+Subject: [PATCH] Add the pre-timeout interrupt defined in IPMI spec
+
+The IPMI watchdog pre-timeout interrupt is used to set the different
+pre-timeout interrupt source. Add them as a dbus property,
+IPMI set/get watchdog commands will use it.
+
+Signed-off-by: Ren Yu <yux.ren@intel.com>
+---
+ xyz/openbmc_project/State/Watchdog.interface.yaml | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+diff --git a/xyz/openbmc_project/State/Watchdog.interface.yaml b/xyz/openbmc_project/State/Watchdog.interface.yaml
+index 2fc47d8..6dfa9b9 100644
+--- a/xyz/openbmc_project/State/Watchdog.interface.yaml
++++ b/xyz/openbmc_project/State/Watchdog.interface.yaml
+@@ -33,6 +33,11 @@ properties:
+ description: >
+ The action the watchdog should perform when it expires.
+ default: 'HardReset'
++ - name: PreTimeoutInterrupt
++ type: enum[self.PreTimeoutInterruptAction]
++ description: >
++ The BMC generates the selected interrupt before the timer expires.
++ default: 'None'
+ - name: Interval
+ type: uint64
+ description: >
+@@ -73,6 +78,23 @@ enumerations:
+ description: >
+ Perform a power cycle of the system.
+
++ - name: PreTimeoutInterruptAction
++ description: >
++ The type of PreTimeout Interrupt.
++ values:
++ - name: 'None'
++ description: >
++ Do nothing.
++ - name: 'SMI'
++ description: >
++ SMI.
++ - name: 'NMI'
++ description: >
++ NMI / Diagnostic Interrupt.
++ - name: 'MI'
++ description: >
++ Messaging Interrupt.
++
+ - name: TimerUse
+ description: >
+ The type of timer use.
+--
+2.7.4
+
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces/0025-Add-PreInterruptFlag-properity-in-DBUS.patch b/meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces/0025-Add-PreInterruptFlag-properity-in-DBUS.patch
new file mode 100644
index 000000000..d7e66abd2
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces/0025-Add-PreInterruptFlag-properity-in-DBUS.patch
@@ -0,0 +1,39 @@
+From b7c487750c05dcc081219ccdd4ef539beef6aa30 Mon Sep 17 00:00:00 2001
+From: Ren Yu <yux.ren@intel.com>
+Date: Mon, 29 Jul 2019 10:51:12 +0800
+Subject: [PATCH] Add PreInterruptFlag properity in DBUS.
+
+PreTimeoutInterruptOccurFlag in DBUS would be set 'true'
+when watchdog pre-timeout interrupt occurred.
+
+Tested:
+Enable command(raw 0x06 0x31) that get message flag
+can set right bit about watchdog,
+need record PreTimeoutInterruptOccurFlag
+at xyz.openbmmc_project.State.Watchdog when watchdog
+pre-timeout interrupt occurred.
+
+Signed-off-by: Ren Yu <yux.ren@intel.com>
+---
+ xyz/openbmc_project/State/Watchdog.interface.yaml | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/xyz/openbmc_project/State/Watchdog.interface.yaml b/xyz/openbmc_project/State/Watchdog.interface.yaml
+index bf4cca0..6579368 100644
+--- a/xyz/openbmc_project/State/Watchdog.interface.yaml
++++ b/xyz/openbmc_project/State/Watchdog.interface.yaml
+@@ -59,6 +59,11 @@ properties:
+ description: >
+ The timer user at the time of expiration.
+ default: 'Reserved'
++ - name: PreTimeoutInterruptOccurFlag
++ type: boolean
++ description: >
++ PreTimeoutInterruptOccurFlag that preTimeoutInterrupt action occurred.
++ default: false
+
+ enumerations:
+ - name: Action
+--
+2.7.4
+
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces_%.bbappend
new file mode 100644
index 000000000..0b5bff905
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/dbus/phosphor-dbus-interfaces_%.bbappend
@@ -0,0 +1,5 @@
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
+
+SRC_URI_append_gbs = " file://0024-Add-the-pre-timeout-interrupt-defined-in-IPMI-spec.patch \
+ file://0025-Add-PreInterruptFlag-properity-in-DBUS.patch \
+ "
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/config.json b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/config.json
new file mode 100644
index 000000000..7c817d420
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/config.json
@@ -0,0 +1,342 @@
+{
+ "version" : "R02",
+ "sensors" : [
+ {
+ "name": "fan0",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan0",
+ "writePath": "/sys/devices/platform/ahb/ahb:apb/f0103000.pwm-fan-controller/hwmon/Fan_0_To_4_Hwmon/pwm1",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fan1",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1",
+ "writePath": "/sys/devices/platform/ahb/ahb:apb/f0103000.pwm-fan-controller/hwmon/Fan_0_To_4_Hwmon/pwm2",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fb_fan0",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fb_fan0",
+ "writePath": "/sys/devices/platform/ahb/ahb:apb/f0103000.pwm-fan-controller/hwmon/Fan_0_To_4_Hwmon/pwm3",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fb_fan1",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fb_fan1",
+ "writePath": "/sys/devices/platform/ahb/ahb:apb/f0103000.pwm-fan-controller/hwmon/Fan_0_To_4_Hwmon/pwm4",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fb_fan2",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fb_fan2",
+ "writePath": "/sys/devices/platform/ahb/ahb:apb/f0103000.pwm-fan-controller/hwmon/Fan_0_To_4_Hwmon/pwm5",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fleeting0",
+ "type": "margin",
+ "readPath": "/xyz/openbmc_project/extsensors/margin/fleeting0",
+ "writePath": "",
+ "min": 0,
+ "max": 0,
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ },
+ {
+ "name": "fleeting1",
+ "type": "margin",
+ "readPath": "/xyz/openbmc_project/extsensors/margin/fleeting1",
+ "writePath": "",
+ "min": 0,
+ "max": 0,
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ },
+ {
+ "name": "cputemp",
+ "type": "margin",
+ "readPath": "/xyz/openbmc_project/extsensors/margin/cputemp",
+ "writePath": "",
+ "min": 0,
+ "max": 0,
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ },
+ {
+ "name": "zone0_vr",
+ "type": "margin",
+ "readPath": "/xyz/openbmc_project/extsensors/margin/zone0_vr",
+ "writePath": "",
+ "min": 0,
+ "max": 0,
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ },
+ {
+ "name": "nvme",
+ "type": "margin",
+ "readPath": "/xyz/openbmc_project/extsensors/margin/nvme",
+ "writePath": "",
+ "min": 0,
+ "max": 0,
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ },
+ {
+ "name": "p12v_fan",
+ "type": "margin",
+ "readPath": "/xyz/openbmc_project/extsensors/margin/p12v_fan",
+ "writePath": "",
+ "min": 0,
+ "max": 0,
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ }
+ ],
+ "zones" : [
+ {
+ "id": 0,
+ "minThermalOutput": 0.0,
+ "failsafePercent": 100.0,
+ "pids": [
+ {
+ "name": "fan0",
+ "type": "fan",
+ "inputs": ["fan0"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0056,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "fan1",
+ "type": "fan",
+ "inputs": ["fan1"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0056,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "cputemp",
+ "type": "margin",
+ "inputs": ["cputemp"],
+ "setpoint": 10.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": 714.0,
+ "integralCoeff": 9.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 1786.0,
+ "integralLimit_max": 18000.0,
+ "outLim_min": 1786.0,
+ "outLim_max": 18000.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 0.0,
+ "negativeHysteresis": 0.0
+ }
+ },
+ {
+ "name": "zone0_vr",
+ "type": "margin",
+ "inputs": ["zone0_vr"],
+ "setpoint": 10.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": 536.0,
+ "integralCoeff": 9.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 1786.0,
+ "integralLimit_max": 18000.0,
+ "outLim_min": 1786.0,
+ "outLim_max": 18000.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 0.0,
+ "negativeHysteresis": 0.0
+ }
+ },
+ {
+ "name": "fleeting0",
+ "type": "margin",
+ "inputs": ["fleeting0"],
+ "setpoint": 10.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": 536.0,
+ "integralCoeff": 9.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 1786.0,
+ "integralLimit_max": 18000.0,
+ "outLim_min": 1786.0,
+ "outLim_max": 18000.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 0.0,
+ "negativeHysteresis": 0.0
+ }
+ },
+ {
+ "name": "fleeting1",
+ "type": "margin",
+ "inputs": ["fleeting1"],
+ "setpoint": 10.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": 536.0,
+ "integralCoeff": 18.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 1786.0,
+ "integralLimit_max": 18000.0,
+ "outLim_min": 1786.0,
+ "outLim_max": 18000.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 0.0,
+ "negativeHysteresis": 0.0
+ }
+ }
+ ]
+ },
+ {
+ "id": 1,
+ "minThermalOutput": 0.0,
+ "failsafePercent": 100.0,
+ "pids": [
+ {
+ "name": "fb_fan0",
+ "type": "fan",
+ "inputs": ["fb_fan0"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0056,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "fb_fan1",
+ "type": "fan",
+ "inputs": ["fb_fan1"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0056,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "fb_fan2",
+ "type": "fan",
+ "inputs": ["fb_fan2"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0056,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "nvme",
+ "type": "margin",
+ "inputs": ["nvme"],
+ "setpoint": 10.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": 1786.0,
+ "integralCoeff": 36.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 1786.0,
+ "integralLimit_max": 18000.0,
+ "outLim_min": 1786.0,
+ "outLim_max": 18000.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 0.0,
+ "negativeHysteresis": 0.0
+ }
+ },
+ {
+ "name": "p12v_fan",
+ "type": "margin",
+ "inputs": ["p12v_fan"],
+ "setpoint": 10.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": 268.0,
+ "integralCoeff": 4.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 1786.0,
+ "integralLimit_max": 18000.0,
+ "outLim_min": 1786.0,
+ "outLim_max": 18000.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 0.0,
+ "negativeHysteresis": 0.0
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh
new file mode 100644
index 000000000..22cfab582
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+
+for i in {1..5};
+do
+ echo 255 > /sys/class/hwmon/*/pwm${i}
+done
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service
new file mode 100644
index 000000000..681bdbe00
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Set Fan to Default Duty as Rebooting
+DefaultDependencies=no
+After=shutdown.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=true
+ExecStart=/usr/bin/fan-default-speed.sh
+
+[Install]
+WantedBy=shutdown.target
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-table-init.sh b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-table-init.sh
new file mode 100644
index 000000000..5706a73fb
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/fan-table-init.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+
+# wait for fan dbus
+mapper wait /xyz/openbmc_project/sensors/fan_tach/fan0
+mapper wait /xyz/openbmc_project/sensors/fan_tach/fan1
+mapper wait /xyz/openbmc_project/sensors/fan_tach/fb_fan0
+mapper wait /xyz/openbmc_project/sensors/fan_tach/fb_fan1
+mapper wait /xyz/openbmc_project/sensors/fan_tach/fb_fan2
+
+/usr/bin/fan-default-speed.sh
+
+# generate fan table writePath
+Fan_0_To_4_Hwmon="$(ls -la /sys/class/hwmon |grep pwm | head -n 1| tail -n +1|cut -d '/' -f 9)"
+
+if [[ "$Fan_0_To_4_Hwmon" != "" ]]
+then
+ sed -i "s/Fan_0_To_4_Hwmon/$Fan_0_To_4_Hwmon/g" /usr/share/swampd/config.json
+fi
+
+# start read margin temp wait
+/usr/bin/read-margin-temp-wait.sh &
+
+exit 0
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service
new file mode 100644
index 000000000..33a441928
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Swampd Margin-based Fan Control Daemon
+After=xyz.openbmc_project.Hwmon@-ahb-apb-pwm\x2dfan\x2dcontroller\x40103000.service
+
+[Service]
+Type=simple
+ExecStartPre=/usr/bin/fan-table-init.sh
+ExecStart=/usr/bin/swampd
+Restart=always
+RestartSec=5
+StartLimitInterval=0
+ExecStopPost=/usr/bin/fan-default-speed.sh
+
+[Install]
+WantedBy=basic.target
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control_%.bbappend
new file mode 100644
index 000000000..f87a49394
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/fans/phosphor-pid-control_%.bbappend
@@ -0,0 +1,31 @@
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
+SRC_URI_append_gbs = " file://config.json"
+SRC_URI_append_gbs = " file://fan-table-init.sh"
+SRC_URI_append_gbs = " file://fan-default-speed.sh"
+SRC_URI_append_gbs = " file://phosphor-pid-control.service"
+SRC_URI_append_gbs = " file://fan-reboot-control.service"
+
+FILES_${PN}_append_gbs = " ${datadir}/swampd/config.json"
+FILES_${PN}_append_gbs = " ${bindir}/fan-default-speed.sh"
+FILES_${PN}_append_gbs = " ${bindir}/fan-table-init.sh"
+
+RDEPENDS_${PN} += "bash"
+
+SYSTEMD_SERVICE_${PN}_append_gbs = " phosphor-pid-control.service"
+SYSTEMD_SERVICE_${PN}_append_gbs = " fan-reboot-control.service"
+
+do_install_append_gbs() {
+ install -d ${D}/${bindir}
+ install -m 0755 ${WORKDIR}/fan-default-speed.sh ${D}/${bindir}
+ install -m 0755 ${WORKDIR}/fan-table-init.sh ${D}/${bindir}
+
+ install -d ${D}${datadir}/swampd
+ install -m 0644 -D ${WORKDIR}/config.json \
+ ${D}${datadir}/swampd/config.json
+
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/phosphor-pid-control.service \
+ ${D}${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/fan-reboot-control.service \
+ ${D}${systemd_system_unitdir}
+}
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-0.conf b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-0.conf
new file mode 100644
index 000000000..e26c8f50e
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-0.conf
@@ -0,0 +1,6 @@
+#The gpio 70 is a real gpio, which is used to
+#store the sas cable 0 present signal
+INVENTORY=/system/chassis/cable/ss_cab0_prsnt
+DEVPATH=/dev/input/event0
+KEY=70
+NAME=ss_cab0_prsnt
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-1.conf b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-1.conf
new file mode 100644
index 000000000..e6a18ee6c
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-1.conf
@@ -0,0 +1,6 @@
+#The gpio 71 is a real gpio, which is used to
+#store the sas cable 1 present signal
+INVENTORY=/system/chassis/cable/ss_cab1_prsnt
+DEVPATH=/dev/input/event0
+KEY=71
+NAME=ss_cab1_prsnt
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-2.conf b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-2.conf
new file mode 100644
index 000000000..490f97f49
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-2.conf
@@ -0,0 +1,6 @@
+#The gpio 72 is a real gpio, which is used to
+#store the sas cable 2 present signal
+INVENTORY=/system/chassis/cable/ss_cab2_prsnt
+DEVPATH=/dev/input/event0
+KEY=72
+NAME=ss_cab2_prsnt
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-3.conf b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-3.conf
new file mode 100644
index 000000000..f3579ab97
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-3.conf
@@ -0,0 +1,6 @@
+#The gpio 73 is a real gpio, which is used to
+#store the sas cable 3 present signal
+INVENTORY=/system/chassis/cable/ss_cab3_prsnt
+DEVPATH=/dev/input/event0
+KEY=73
+NAME=ss_cab3_prsnt
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-4.conf b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-4.conf
new file mode 100644
index 000000000..be6ed95af
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-4.conf
@@ -0,0 +1,6 @@
+#The gpio 57 is a real gpio, which is used to
+#store the HSBP cable present signal
+INVENTORY=/system/chassis/cable/hsbp_cab_prsnt
+DEVPATH=/dev/input/event0
+KEY=57
+NAME=hsbp_cab_prsnt
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-5.conf b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-5.conf
new file mode 100644
index 000000000..223ef4a7c
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-5.conf
@@ -0,0 +1,6 @@
+#The gpio 58 is a real gpio, which is used to
+#store the fan board cable present signal
+INVENTORY=/system/chassis/cable/fanbd_cab_prsnt
+DEVPATH=/dev/input/event0
+KEY=58
+NAME=fanbd_cab_prsnt
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-6.conf b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-6.conf
new file mode 100644
index 000000000..c32fb3c97
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-6.conf
@@ -0,0 +1,6 @@
+#The gpio 69 is a real gpio, which is used to
+#store the HSBP 12V standby cable present signal
+INVENTORY=/system/chassis/cable/bp12v_cab_prsnt
+DEVPATH=/dev/input/event0
+KEY=69
+NAME=bp12v_cab_prsnt
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-7.conf b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-7.conf
new file mode 100644
index 000000000..1cc7da265
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-7.conf
@@ -0,0 +1,6 @@
+#The gpio 5 is a real gpio, which is used to
+#store the SATA0 present signal
+INVENTORY=/system/chassis/entity/sata0_prsnt
+DEVPATH=/dev/input/event0
+KEY=5
+NAME=sata0_prsnt
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-8.conf b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-8.conf
new file mode 100644
index 000000000..38c72e11e
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-8.conf
@@ -0,0 +1,6 @@
+#The gpio 120 is a real gpio, which is used to
+#store the PE0 present signal
+INVENTORY=/system/chassis/entity/pe_slot0_prsnt
+DEVPATH=/dev/input/event0
+KEY=120
+NAME=pe_slot0_prsnt
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-9.conf b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-9.conf
new file mode 100644
index 000000000..007229d44
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/obmc/gpio/gpios-9.conf
@@ -0,0 +1,6 @@
+#The gpio 121 is a real gpio, which is used to
+#store the PE1 present signal
+INVENTORY=/system/chassis/entity/pe_slot1_prsnt
+DEVPATH=/dev/input/event0
+KEY=121
+NAME=pe_slot1_prsnt
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/phosphor-gpio-presence@.service.replace b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/phosphor-gpio-presence@.service.replace
new file mode 100644
index 000000000..15341cbfb
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor/phosphor-gpio-presence@.service.replace
@@ -0,0 +1,14 @@
+[Unit]
+Description=Phosphor GPIO %I Presence
+Wants=mapper-wait@-xyz-openbmc_project-inventory.service
+After=mapper-wait@-xyz-openbmc_project-inventory.service
+ConditionPathExists=/etc/default/obmc/gpio/gpios-%i.conf
+StartLimitBurst=10
+
+[Service]
+Restart=on-failure
+EnvironmentFile=/etc/default/obmc/gpio/gpios-%i.conf
+ExecStart=/usr/bin/phosphor-gpio-presence --path=${DEVPATH} --inventory=${INVENTORY} --key=${KEY} --name=${NAME} --drivers=${DRIVERS} --extra-ifaces=${EXTRA_IFACES}
+
+[Install]
+RequiredBy=multi-user.target
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor_%.bbappend
new file mode 100644
index 000000000..d45636609
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/gpio/phosphor-gpio-monitor_%.bbappend
@@ -0,0 +1,32 @@
+inherit obmc-phosphor-systemd
+
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
+
+SRC_URI_append_gbs = " file://phosphor-gpio-presence@.service.replace"
+
+TMPL_PRESENT = "phosphor-gpio-presence@.service"
+INSTFMT_PRESENT = "phosphor-gpio-presence@{0}.service"
+PRESENT_TGT = "multi-user.target"
+FMT_PRESENT = "../${TMPL_PRESENT}:${PRESENT_TGT}.requires/${INSTFMT_PRESENT}"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs +="obmc/gpio/gpios-0.conf"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs +="obmc/gpio/gpios-1.conf"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs +="obmc/gpio/gpios-2.conf"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs +="obmc/gpio/gpios-3.conf"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs +="obmc/gpio/gpios-4.conf"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs +="obmc/gpio/gpios-5.conf"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs +="obmc/gpio/gpios-6.conf"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs +="obmc/gpio/gpios-7.conf"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs +="obmc/gpio/gpios-8.conf"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs +="obmc/gpio/gpios-9.conf"
+GBS_OBMC_PRESENT_INSTANCES = "0 1 2 3 4 5 6 7 8 9"
+
+SYSTEMD_LINK_${PN}-presence_append_gbs = " ${@compose_list(d, 'FMT_PRESENT', 'GBS_OBMC_PRESENT_INSTANCES')}"
+
+GBS_PRESENT_ENV_FMT = "obmc/gpio/gpios-{0}.conf"
+
+SYSTEMD_ENVIRONMENT_FILE_${PN}-presence_gbs = " ${@compose_list(d, 'GBS_PRESENT_ENV_FMT', 'GBS_OBMC_PRESENT_INSTANCES')}"
+
+do_install_append_gbs() {
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/phosphor-gpio-presence@.service.replace ${D}${systemd_system_unitdir}/phosphor-gpio-presence@.service
+}
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/host/phosphor-host-postd_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/host/phosphor-host-postd_%.bbappend
new file mode 100644
index 000000000..ef3ecb2e4
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/host/phosphor-host-postd_%.bbappend
@@ -0,0 +1,2 @@
+SNOOP_DEVICE_gbs = "npcm7xx-lpc-bpc0"
+PACKAGECONFIG_append_gbs = " 7seg"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/images/obmc-phosphor-image.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/images/obmc-phosphor-image.bbappend
new file mode 100644
index 000000000..3b83932e7
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/images/obmc-phosphor-image.bbappend
@@ -0,0 +1,23 @@
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " phosphor-host-postd"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " phosphor-sel-logger"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " google-ipmi-sys"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " google-ipmi-i2c"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " gbs-hotswap-power-cycle"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " loadsvf"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " gbs-cpld-ver-check"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " memtester"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " net-tools"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " gbs-boot-status-led"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " phosphor-nvme"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " gbs-detect-gpio-present"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " phosphor-ecc"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " gbs-sysinit"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " gbs-ipmi-entity-association-map"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " gbs-detect-fan-fail"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " usb-network"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " mac-address"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " phosphor-image-signing"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " openssl-bin"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " phosphor-ipmi-blobs-binarystore"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " gbs-nvme-pwr-ctrl"
+OBMC_IMAGE_EXTRA_INSTALL_append_gbs = " read-margin-temp"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/interfaces/bmcweb_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/interfaces/bmcweb_%.bbappend
new file mode 100755
index 000000000..87ecf4fa3
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/interfaces/bmcweb_%.bbappend
@@ -0,0 +1,3 @@
+EXTRA_OECMAKE_append_gbs = " \
+ -DBMCWEB_ENABLE_REDFISH_DBUS_LOG_ENTRIES=ON \
+ "
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/inventory/inventory-cleanup.bb b/meta-quanta/meta-gbs/recipes-phosphor/inventory/inventory-cleanup.bb
new file mode 100644
index 000000000..0c4b56f72
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/inventory/inventory-cleanup.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Copy the inventory cleanup yaml for inventory manager"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit allarch
+inherit phosphor-inventory-manager
+
+S = "${WORKDIR}"
+
+SRC_URI = "file://inventory-cleanup.yaml"
+
+do_install() {
+ install -D inventory-cleanup.yaml ${D}${base_datadir}/events.d/inventory-cleanup.yaml
+}
+
+FILES_${PN} += "${base_datadir}/events.d/inventory-cleanup.yaml"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/inventory/inventory-cleanup/inventory-cleanup.yaml b/meta-quanta/meta-gbs/recipes-phosphor/inventory/inventory-cleanup/inventory-cleanup.yaml
new file mode 100644
index 000000000..78e03fee0
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/inventory/inventory-cleanup/inventory-cleanup.yaml
@@ -0,0 +1,16 @@
+description: >
+ GBS inventory fixups
+
+events:
+ - name: Add Chassis interface
+ description: >
+ Add the chassis interface on the chassis inventory path
+ type: startup
+ actions:
+ - name: createObjects
+ objs:
+ /system/chassis:
+ xyz.openbmc_project.Inventory.Item.Chassis:
+ Type:
+ value: "RackMount"
+ type: string
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/inventory/phosphor-inventory-manager/associations.json b/meta-quanta/meta-gbs/recipes-phosphor/inventory/phosphor-inventory-manager/associations.json
new file mode 100644
index 000000000..b834fa876
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/inventory/phosphor-inventory-manager/associations.json
@@ -0,0 +1,487 @@
+[
+ {
+ "path": "system/chassis/motherboard/nvme0",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme0"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme1",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme1"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme2",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme2"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme3",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme3"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme4",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme4"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme5",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme5"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme6",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme6"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme7",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme7"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme8",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme8"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme9",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme9"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme10",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme10"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme11",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme11"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme12",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme12"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme13",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme13"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme14",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme14"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard/nvme15",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/nvme15"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/fan",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/fan_tach/fan0",
+ "/xyz/openbmc_project/sensors/fan_tach/fan1",
+ "/xyz/openbmc_project/sensors/fan_tach/fb_fan0",
+ "/xyz/openbmc_project/sensors/fan_tach/fb_fan1",
+ "/xyz/openbmc_project/sensors/fan_tach/fb_fan2"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis/motherboard",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "inventory",
+ "fType": "sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/i2cool_0",
+ "/xyz/openbmc_project/sensors/temperature/i2cool_1",
+ "/xyz/openbmc_project/sensors/temperature/i2cool_2",
+ "/xyz/openbmc_project/sensors/temperature/powerseq_temp",
+ "/xyz/openbmc_project/sensors/temperature/cputemp",
+ "/xyz/openbmc_project/sensors/temperature/nvme0",
+ "/xyz/openbmc_project/sensors/temperature/nvme1",
+ "/xyz/openbmc_project/sensors/temperature/nvme2",
+ "/xyz/openbmc_project/sensors/temperature/nvme3",
+ "/xyz/openbmc_project/sensors/temperature/nvme4",
+ "/xyz/openbmc_project/sensors/temperature/nvme5",
+ "/xyz/openbmc_project/sensors/temperature/nvme6",
+ "/xyz/openbmc_project/sensors/temperature/nvme7",
+ "/xyz/openbmc_project/sensors/temperature/nvme8",
+ "/xyz/openbmc_project/sensors/temperature/nvme9",
+ "/xyz/openbmc_project/sensors/temperature/nvme10",
+ "/xyz/openbmc_project/sensors/temperature/nvme11",
+ "/xyz/openbmc_project/sensors/temperature/nvme12",
+ "/xyz/openbmc_project/sensors/temperature/nvme13",
+ "/xyz/openbmc_project/sensors/temperature/nvme14",
+ "/xyz/openbmc_project/sensors/temperature/nvme15",
+
+ "/xyz/openbmc_project/sensors/voltage/p1v8_stby",
+ "/xyz/openbmc_project/sensors/voltage/vddcr_soc_stby",
+ "/xyz/openbmc_project/sensors/voltage/p2v5_stby",
+ "/xyz/openbmc_project/sensors/voltage/p1v2_stby",
+ "/xyz/openbmc_project/sensors/voltage/p1v175_stby",
+ "/xyz/openbmc_project/sensors/voltage/p1v8",
+ "/xyz/openbmc_project/sensors/voltage/p3v3",
+ "/xyz/openbmc_project/sensors/voltage/pwrgd_pvpp",
+ "/xyz/openbmc_project/sensors/voltage/pwrgd_pvddio",
+ "/xyz/openbmc_project/sensors/voltage/pwrgd_cpuvr",
+ "/xyz/openbmc_project/sensors/voltage/p3v3_stby",
+ "/xyz/openbmc_project/sensors/voltage/p5v_stby",
+ "/xyz/openbmc_project/sensors/voltage/p3v_bat_adc",
+
+ "/xyz/openbmc_project/sensors/voltage/vddcr_cpu_in",
+ "/xyz/openbmc_project/sensors/voltage/vddcr_cpu_out",
+ "/xyz/openbmc_project/sensors/current/vddcr_cpu_in",
+ "/xyz/openbmc_project/sensors/current/vddcr_cpu_out",
+ "/xyz/openbmc_project/sensors/temperature/vddcr_cpu",
+
+ "/xyz/openbmc_project/sensors/voltage/vddcr_soc_in",
+ "/xyz/openbmc_project/sensors/voltage/vddcr_soc_out",
+ "/xyz/openbmc_project/sensors/current/vddcr_soc_in",
+ "/xyz/openbmc_project/sensors/current/vddcr_soc_out",
+ "/xyz/openbmc_project/sensors/temperature/vddcr_soc",
+
+ "/xyz/openbmc_project/sensors/voltage/vddio_abcd_out",
+ "/xyz/openbmc_project/sensors/voltage/vddio_abcd_in",
+ "/xyz/openbmc_project/sensors/current/vddio_abcd_in",
+ "/xyz/openbmc_project/sensors/current/vddio_abcd_out",
+ "/xyz/openbmc_project/sensors/temperature/vddio_abcd",
+
+ "/xyz/openbmc_project/sensors/voltage/vddio_efgh_out",
+ "/xyz/openbmc_project/sensors/voltage/vddio_efgh_in",
+ "/xyz/openbmc_project/sensors/current/vddio_efgh_in",
+ "/xyz/openbmc_project/sensors/current/vddio_efgh_out",
+ "/xyz/openbmc_project/sensors/temperature/vddio_efgh",
+
+ "/xyz/openbmc_project/sensors/voltage/p12v_mobo_out",
+ "/xyz/openbmc_project/sensors/voltage/p12v_mobo_in",
+ "/xyz/openbmc_project/sensors/current/p12v_mobo_in",
+ "/xyz/openbmc_project/sensors/current/p12v_mobo_out",
+ "/xyz/openbmc_project/sensors/temperature/p12v_mobo",
+
+ "/xyz/openbmc_project/sensors/voltage/p12v_fan_out",
+ "/xyz/openbmc_project/sensors/voltage/p12v_fan_in",
+ "/xyz/openbmc_project/sensors/current/p12v_fan_in",
+ "/xyz/openbmc_project/sensors/current/p12v_fan_out",
+ "/xyz/openbmc_project/sensors/temperature/p12v_fan",
+
+ "/xyz/openbmc_project/sensors/voltage/hotswap_vin",
+ "/xyz/openbmc_project/sensors/voltage/hotswap_vout",
+ "/xyz/openbmc_project/sensors/current/hotswap_iout",
+ "/xyz/openbmc_project/sensors/power/hotswap_pout",
+ "/xyz/openbmc_project/sensors/temperature/hotswap"
+ ]
+ }
+ ]
+ },
+ {
+ "path": "system/chassis",
+ "endpoints":
+ [
+ {
+ "types":
+ {
+ "rType": "chassis",
+ "fType": "all_sensors"
+ },
+ "paths":
+ [
+ "/xyz/openbmc_project/sensors/temperature/i2cool_0",
+ "/xyz/openbmc_project/sensors/temperature/i2cool_1",
+ "/xyz/openbmc_project/sensors/temperature/i2cool_2",
+ "/xyz/openbmc_project/sensors/temperature/powerseq_temp",
+ "/xyz/openbmc_project/sensors/temperature/cputemp",
+ "/xyz/openbmc_project/sensors/temperature/nvme0",
+ "/xyz/openbmc_project/sensors/temperature/nvme1",
+ "/xyz/openbmc_project/sensors/temperature/nvme2",
+ "/xyz/openbmc_project/sensors/temperature/nvme3",
+ "/xyz/openbmc_project/sensors/temperature/nvme4",
+ "/xyz/openbmc_project/sensors/temperature/nvme5",
+ "/xyz/openbmc_project/sensors/temperature/nvme6",
+ "/xyz/openbmc_project/sensors/temperature/nvme7",
+ "/xyz/openbmc_project/sensors/temperature/nvme8",
+ "/xyz/openbmc_project/sensors/temperature/nvme9",
+ "/xyz/openbmc_project/sensors/temperature/nvme10",
+ "/xyz/openbmc_project/sensors/temperature/nvme11",
+ "/xyz/openbmc_project/sensors/temperature/nvme12",
+ "/xyz/openbmc_project/sensors/temperature/nvme13",
+ "/xyz/openbmc_project/sensors/temperature/nvme14",
+ "/xyz/openbmc_project/sensors/temperature/nvme15",
+
+ "/xyz/openbmc_project/sensors/voltage/p1v8_stby",
+ "/xyz/openbmc_project/sensors/voltage/vddcr_soc_stby",
+ "/xyz/openbmc_project/sensors/voltage/p2v5_stby",
+ "/xyz/openbmc_project/sensors/voltage/p1v2_stby",
+ "/xyz/openbmc_project/sensors/voltage/p1v175_stby",
+ "/xyz/openbmc_project/sensors/voltage/p1v8",
+ "/xyz/openbmc_project/sensors/voltage/p3v3",
+ "/xyz/openbmc_project/sensors/voltage/pwrgd_pvpp",
+ "/xyz/openbmc_project/sensors/voltage/pwrgd_pvddio",
+ "/xyz/openbmc_project/sensors/voltage/pwrgd_cpuvr",
+ "/xyz/openbmc_project/sensors/voltage/p3v3_stby",
+ "/xyz/openbmc_project/sensors/voltage/p5v_stby",
+ "/xyz/openbmc_project/sensors/voltage/p3v_bat_adc",
+
+ "/xyz/openbmc_project/sensors/voltage/vddcr_cpu_in",
+ "/xyz/openbmc_project/sensors/voltage/vddcr_cpu_out",
+ "/xyz/openbmc_project/sensors/current/vddcr_cpu_in",
+ "/xyz/openbmc_project/sensors/current/vddcr_cpu_out",
+ "/xyz/openbmc_project/sensors/temperature/vddcr_cpu",
+
+ "/xyz/openbmc_project/sensors/voltage/vddcr_soc_in",
+ "/xyz/openbmc_project/sensors/voltage/vddcr_soc_out",
+ "/xyz/openbmc_project/sensors/current/vddcr_soc_in",
+ "/xyz/openbmc_project/sensors/current/vddcr_soc_out",
+ "/xyz/openbmc_project/sensors/temperature/vddcr_soc",
+
+ "/xyz/openbmc_project/sensors/voltage/vddio_abcd_out",
+ "/xyz/openbmc_project/sensors/voltage/vddio_abcd_in",
+ "/xyz/openbmc_project/sensors/current/vddio_abcd_in",
+ "/xyz/openbmc_project/sensors/current/vddio_abcd_out",
+ "/xyz/openbmc_project/sensors/temperature/vddio_abcd",
+
+ "/xyz/openbmc_project/sensors/voltage/vddio_efgh_out",
+ "/xyz/openbmc_project/sensors/voltage/vddio_efgh_in",
+ "/xyz/openbmc_project/sensors/current/vddio_efgh_in",
+ "/xyz/openbmc_project/sensors/current/vddio_efgh_out",
+ "/xyz/openbmc_project/sensors/temperature/vddio_efgh",
+
+ "/xyz/openbmc_project/sensors/voltage/p12v_mobo_out",
+ "/xyz/openbmc_project/sensors/voltage/p12v_mobo_in",
+ "/xyz/openbmc_project/sensors/current/p12v_mobo_in",
+ "/xyz/openbmc_project/sensors/current/p12v_mobo_out",
+ "/xyz/openbmc_project/sensors/temperature/p12v_mobo",
+
+ "/xyz/openbmc_project/sensors/voltage/p12v_fan_out",
+ "/xyz/openbmc_project/sensors/voltage/p12v_fan_in",
+ "/xyz/openbmc_project/sensors/current/p12v_fan_in",
+ "/xyz/openbmc_project/sensors/current/p12v_fan_out",
+ "/xyz/openbmc_project/sensors/temperature/p12v_fan",
+
+ "/xyz/openbmc_project/sensors/voltage/hotswap_vin",
+ "/xyz/openbmc_project/sensors/voltage/hotswap_vout",
+ "/xyz/openbmc_project/sensors/current/hotswap_iout",
+ "/xyz/openbmc_project/sensors/power/hotswap_pout",
+ "/xyz/openbmc_project/sensors/temperature/hotswap",
+
+ "/xyz/openbmc_project/sensors/fan_tach/fan0",
+ "/xyz/openbmc_project/sensors/fan_tach/fan1",
+ "/xyz/openbmc_project/sensors/fan_tach/fb_fan0",
+ "/xyz/openbmc_project/sensors/fan_tach/fb_fan1",
+ "/xyz/openbmc_project/sensors/fan_tach/fb_fan2"
+ ]
+ }
+ ]
+ }
+]
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/inventory/phosphor-inventory-manager_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/inventory/phosphor-inventory-manager_%.bbappend
new file mode 100644
index 000000000..205822cb9
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/inventory/phosphor-inventory-manager_%.bbappend
@@ -0,0 +1,9 @@
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
+PACKAGECONFIG_append_gbs = " associations"
+SRC_URI_append_gbs = " file://associations.json"
+DEPENDS_append_gbs = " inventory-cleanup"
+
+do_install_append_gbs() {
+ install -d ${D}${base_datadir}
+ install -m 0755 ${WORKDIR}/associations.json ${D}${base_datadir}/associations.json
+}
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-blobs-binarystore/config.json b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-blobs-binarystore/config.json
new file mode 100644
index 000000000..4ad11bc6e
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-blobs-binarystore/config.json
@@ -0,0 +1,5 @@
+[{
+ "blobBaseId": "/skm/hss/",
+ "sysFilePath": "/sys/class/i2c-adapter/i2c-5/5-0050/5-00500/nvmem",
+ "offsetBytes": 256
+}]
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-blobs-binarystore_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-blobs-binarystore_%.bbappend
new file mode 100644
index 000000000..1dba2ec35
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-blobs-binarystore_%.bbappend
@@ -0,0 +1,8 @@
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
+SRC_URI_append_gbs = " file://config.json"
+FILES_${PN}_append_gbs = " ${datadir}/binaryblob/config.json"
+
+do_install_append_gbs() {
+ install -d ${D}${datadir}/binaryblob/
+ install ${WORKDIR}/config.json ${D}${datadir}/binaryblob/config.json
+}
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config.bbappend
new file mode 100644
index 000000000..ca7172498
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config/dev_id.json b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config/dev_id.json
new file mode 100644
index 000000000..bc98176b5
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config/dev_id.json
@@ -0,0 +1,2 @@
+{"id": 32, "revision": 129, "addn_dev_support": 141,
+ "manuf_id": 7244, "prod_id": 14401, "aux": 0}
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config/entity-map.json b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config/entity-map.json
new file mode 100644
index 000000000..cb08553b3
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-config/entity-map.json
@@ -0,0 +1,28 @@
+[
+ {
+ "id": 1,
+ "containerEntityId" : 30,
+ "containerEntityInstance" : 0,
+ "isList" : false,
+ "isLinked" : false,
+ "entities" : [
+ {"id" : 11, "instance" : 0},
+ {"id" : 11, "instance" : 1},
+ {"id" : 29, "instance" : 0},
+ {"id" : 29, "instance" : 1}
+ ]
+ },
+ {
+ "id": 2,
+ "containerEntityId" : 30,
+ "containerEntityInstance" : 1,
+ "isList" : false,
+ "isLinked" : false,
+ "entities" : [
+ {"id" : 29, "instance" : 2},
+ {"id" : 29, "instance" : 4},
+ {"id" : 0, "instance" : 0},
+ {"id" : 0, "instance" : 0}
+ ]
+ }
+]
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-flash_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-flash_%.bbappend
new file mode 100644
index 000000000..9f4c89026
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-flash_%.bbappend
@@ -0,0 +1,5 @@
+NUVOTON_FLASH_PCIMBOX = "0xF0848000"
+
+EXTRA_OECONF_append_gbs = " --enable-nuvoton-p2a-mbox"
+
+IPMI_FLASH_BMC_ADDRESS_gbs = "${NUVOTON_FLASH_PCIMBOX}"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/fan b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/fan
new file mode 100644
index 000000000..9bb4f2c09
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/fan
@@ -0,0 +1,3 @@
+OF_NAME=fan_fru
+SYSFS_PATH=/no-such-path/eeprom
+FRUID=0x02
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/hsbp b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/hsbp
new file mode 100644
index 000000000..cb099974c
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/hsbp
@@ -0,0 +1,3 @@
+OF_NAME=hsbp_fru
+SYSFS_PATH=/no-such-path/eeprom
+FRUID=0x01
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/motherboard b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/motherboard
new file mode 100644
index 000000000..0b36379f7
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru/obmc/eeproms/system/chassis/motherboard
@@ -0,0 +1,3 @@
+OF_NAME=mb_fru
+SYSFS_PATH=/sys/bus/i2c/devices/5-0050/eeprom
+FRUID=0x00
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru_%.bbappend
new file mode 100644
index 000000000..877129716
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-fru_%.bbappend
@@ -0,0 +1,26 @@
+inherit obmc-phosphor-systemd
+DEPENDS_append_gbs = " gbs-yaml-config"
+
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
+
+EEPROM_NAMES = "motherboard hsbp fan"
+
+EEPROMFMT = "system/chassis/{0}"
+EEPROM_ESCAPEDFMT = "system-chassis-{0}"
+EEPROMS = "${@compose_list(d, 'EEPROMFMT', 'EEPROM_NAMES')}"
+EEPROMS_ESCAPED = "${@compose_list(d, 'EEPROM_ESCAPEDFMT', 'EEPROM_NAMES')}"
+
+ENVFMT = "obmc/eeproms/{0}"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs := " ${@compose_list(d, 'ENVFMT', 'EEPROMS')}"
+
+TMPL = "obmc-read-eeprom@.service"
+TGT = "multi-user.target"
+INSTFMT = "obmc-read-eeprom@{0}.service"
+FMT = "../${TMPL}:${TGT}.wants/${INSTFMT}"
+
+SYSTEMD_LINK_${PN}_append_gbs := " ${@compose_list(d, 'FMT', 'EEPROMS_ESCAPED')}"
+
+EXTRA_OECONF_append_gbs = " \
+ YAML_GEN=${STAGING_DIR_HOST}${datadir}/gbs-yaml-config/ipmi-fru-read.yaml \
+ PROP_YAML=${STAGING_DIR_HOST}${datadir}/gbs-yaml-config/ipmi-extra-properties.yaml \
+ "
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host/0063-Save-the-pre-timeout-interrupt-in-dbus-property.patch b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host/0063-Save-the-pre-timeout-interrupt-in-dbus-property.patch
new file mode 100644
index 000000000..d815cde72
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host/0063-Save-the-pre-timeout-interrupt-in-dbus-property.patch
@@ -0,0 +1,138 @@
+From 9deb72959477700216326c033c930236e58f965f Mon Sep 17 00:00:00 2001
+From: Ren Yu <yux.ren@intel.com>
+Date: Tue, 28 May 2019 17:11:17 +0800
+Subject: [PATCH] Save the pre-timeout interrupt in dbus property
+
+Get the watchdog pre-timeout interrupt value from ipmi watchdog set command,
+and store it into dbus property.
+
+Tested:
+Config IPMI watchdog: BIOS FRB2 Power Cycle after 1 seconds:
+ipmitool raw 0x06 0x24 0x01 0x13 0x0 0x2 0xa 0x00
+Start watchdog:
+Ipmitool mc watchdog reset
+Check the watchdog pre-timeout interrupt in below:
+https://BMCIP/redfish/v1/Systems/system/LogServices/EventLog/Entries
+
+Signed-off-by: Ren Yu <yux.ren@intel.com>
+
+---
+ app/watchdog.cpp | 47 ++++++++++++++++++++++++++++++++++++++++
+ app/watchdog_service.cpp | 6 +++++
+ app/watchdog_service.hpp | 9 ++++++++
+ 3 files changed, 62 insertions(+)
+
+diff --git a/app/watchdog.cpp b/app/watchdog.cpp
+index 03c373e..cb0b1fd 100644
+--- a/app/watchdog.cpp
++++ b/app/watchdog.cpp
+@@ -80,6 +80,7 @@ ipmi::RspType<> ipmiAppResetWatchdogTimer()
+
+ static constexpr uint8_t wd_dont_stop = 0x1 << 6;
+ static constexpr uint8_t wd_timeout_action_mask = 0x3;
++static constexpr uint8_t wdPreTimeoutInterruptMask = 0x3;
+
+ static constexpr uint8_t wdTimerUseResTimer1 = 0x0;
+ static constexpr uint8_t wdTimerUseResTimer2 = 0x6;
+@@ -127,6 +128,45 @@ WatchdogService::Action ipmiActionToWdAction(IpmiAction ipmi_action)
+ }
+ }
+
++enum class IpmiPreTimeoutInterrupt : uint8_t
++{
++ None = 0x0,
++ SMI = 0x1,
++ NMI = 0x2,
++ MI = 0x3,
++};
++/** @brief Converts an IPMI Watchdog PreTimeoutInterrupt to DBUS defined action
++ * @param[in] ipmi_action The IPMI Watchdog PreTimeoutInterrupt
++ * @return The Watchdog PreTimeoutInterrupt that the ipmi_action maps to
++ */
++WatchdogService::PreTimeoutInterruptAction ipmiPreTimeoutInterruptToWdAction(
++ IpmiPreTimeoutInterrupt ipmiPreTimeOutInterrupt)
++{
++ switch (ipmiPreTimeOutInterrupt)
++ {
++ case IpmiPreTimeoutInterrupt::None:
++ {
++ return WatchdogService::PreTimeoutInterruptAction::None;
++ }
++ case IpmiPreTimeoutInterrupt::SMI:
++ {
++ return WatchdogService::PreTimeoutInterruptAction::SMI;
++ }
++ case IpmiPreTimeoutInterrupt::NMI:
++ {
++ return WatchdogService::PreTimeoutInterruptAction::NMI;
++ }
++ case IpmiPreTimeoutInterrupt::MI:
++ {
++ return WatchdogService::PreTimeoutInterruptAction::MI;
++ }
++ default:
++ {
++ throw std::domain_error("IPMI PreTimeoutInterrupt is invalid");
++ }
++ }
++}
++
+ enum class IpmiTimerUse : uint8_t
+ {
+ Reserved = 0x0,
+@@ -250,6 +290,13 @@ ipmi::RspType<>
+ // Mark as initialized so that future resets behave correctly
+ wd_service.setInitialized(true);
+
++ // pretimeOutAction
++ const auto ipmiPreTimeoutInterrupt =
++ static_cast<IpmiPreTimeoutInterrupt>(wdPreTimeoutInterruptMask &
++ (static_cast<uint8_t>(preTimeoutInterrupt)));
++ wd_service.setPreTimeoutInterrupt(
++ ipmiPreTimeoutInterruptToWdAction(ipmiPreTimeoutInterrupt));
++
+ lastCallSuccessful = true;
+ return ipmi::responseSuccess();
+ }
+diff --git a/app/watchdog_service.cpp b/app/watchdog_service.cpp
+index 3534e89..4df1ab6 100644
+--- a/app/watchdog_service.cpp
++++ b/app/watchdog_service.cpp
+@@ -198,3 +198,9 @@ void WatchdogService::setInterval(uint64_t interval)
+ {
+ setProperty("Interval", interval);
+ }
++
++void WatchdogService::setPreTimeoutInterrupt(
++ PreTimeoutInterruptAction preTimeoutInterrupt)
++{
++ setProperty("PreTimeoutInterrupt", convertForMessage(preTimeoutInterrupt));
++}
+\ No newline at end of file
+diff --git a/app/watchdog_service.hpp b/app/watchdog_service.hpp
+index 141bdb7..32b7461 100644
+--- a/app/watchdog_service.hpp
++++ b/app/watchdog_service.hpp
+@@ -15,6 +15,8 @@ class WatchdogService
+
+ using Action =
+ sdbusplus::xyz::openbmc_project::State::server::Watchdog::Action;
++ using PreTimeoutInterruptAction = sdbusplus::xyz::openbmc_project::State::
++ server::Watchdog::PreTimeoutInterruptAction;
+ using TimerUse =
+ sdbusplus::xyz::openbmc_project::State::server::Watchdog::TimerUse;
+
+@@ -92,6 +94,13 @@ class WatchdogService
+ */
+ void setInterval(uint64_t interval);
+
++ /** @brief Sets the value of the PreTimeoutInterrupt property on the host
++ * watchdog
++ *
++ * @param[in] PreTimeoutInterrupt - The new PreTimeoutInterrupt value
++ */
++ void setPreTimeoutInterrupt(PreTimeoutInterruptAction preTimeoutInterrupt);
++
+ private:
+ /** @brief sdbusplus handle */
+ sdbusplus::bus::bus bus;
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host/gbs-ipmid-whitelist.conf b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host/gbs-ipmid-whitelist.conf
new file mode 100644
index 000000000..359c7dbeb
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host/gbs-ipmid-whitelist.conf
@@ -0,0 +1,79 @@
+#<NetFn>:<Command>
+0x00:0x00 //<Chassis>:<Chassis Capabiliti>
+0x00:0x01 //<Chassis>:<Get Chassis Status>
+0x00:0x02 //<Chassis>:<Chassis Control>
+0x00:0x04 //<Chassis>:<Chassis Identify>
+0x00:0x05 //<Chassis>:<Set Chassis Capabilities>
+0x00:0x06 //<Chassis>:<Set Power Restore Policy>
+0x00:0x08 //<Chassis>:<Set System Boot Options>
+0x00:0x09 //<Chassis>:<Get System Boot Options>
+0x00:0x0F //<Chassis>:<Get POH Counter>
+0x04:0x02 //<Sensor/Event>:<Platform Event>
+0x04:0x20 //<Sensor/Event>:<Get Device SDR Info>
+0x04:0x21 //<Sensor/Event>:<Get Device SDR>
+0x04:0x22 //<Sensor/Event>:<Reserve Device SDR Repository>
+0x04:0x27 //<Sensor/Event>:<Get Sensor Threshold>
+0x04:0x29 //<Sensor/Event>:<Get Sensor Event Enable>
+0x04:0x2B //<Sensor/Event>:<Get Sensor Event Status>
+0x04:0x2D //<Sensor/Event>:<Get Sensor Reading>
+0x04:0x2F //<Sensor/Event>:<Get Sensor Type>
+0x04:0x30 //<Sensor/Event>:<Set Sensor Reading and Event Status>
+0x06:0x01 //<App>:<Get Device ID>
+0x06:0x02 //<App>:<Cold Reset>
+0x06:0x03 //<App>:<Warm Reset>
+0x06:0x04 //<App>:<Get Self Test Results>
+0x06:0x06 //<App>:<Set ACPI Power State>
+0x06:0x07 //<App>:<Get ACPI Power State>
+0x06:0x08 //<App>:<Get Device GUID>
+0x06:0x22 //<App>:<Reset Watchdog Timer>
+0x06:0x24 //<App>:<Set Watchdog Timer>
+0x06:0x25 //<App>:<Get Watchdog Timer>
+0x06:0x35 //<App>:<Read Event Message Buffer>
+0x06:0x3D //<App>:<Get Session Info>
+0x06:0x40 //<App>:<Set Channel Access>
+0x06:0x41 //<App>:<Get Channel Access>
+0x06:0x42 //<App>:<Get Channel Info>
+0x06:0x43 //<App>:<Set User Access>
+0x06:0x44 //<App>:<Get User Access>
+0x06:0x45 //<App>:<Set User Name>
+0x06:0x46 //<App>:<Get User Name>
+0x06:0x47 //<App>:<Set User Password>
+0x06:0x48 //<App>:<Activate Payload>
+0x06:0x49 //<App>:<Deactivate Payload>
+0x06:0x4A //<App>:<Get Payload Activation Status>
+0x06:0x4B //<App>:<Get Payload Instance Info>
+0x06:0x54 //<App>:<Get Channel Cipher Suites>
+0x06:0x58 //<App>:<Set System Info Parameters>
+0x06:0x59 //<App>:<Get System Info Parameters>
+0x0A:0x10 //<Storage>:<Get FRU Inventory Area Info>
+0x0A:0x11 //<Storage>:<Read FRU Data>
+0x0A:0x20 //<Storage>:<Get SDR Repository Info>
+0x0A:0x22 //<Storage>:<Reserve SDR Repository>
+0x0A:0x23 //<Storage>:<Get SDR>
+0x0A:0x40 //<Storage>:<Get SEL Info>
+0x0A:0x42 //<Storage>:<Reserve SEL>
+0x0A:0x43 //<Storage>:<Get SEL Entry>
+0x0A:0x44 //<Storage>:<Add SEL Entry>
+0x0A:0x46 //<Storage>:<Delete SEL Entry>
+0x0A:0x47 //<Storage>:<Clear SEL>
+0x0A:0x48 //<Storage>:<Get SEL Time>
+0x0A:0x49 //<Storage>:<Set SEL Time>
+0x0C:0x01 //<Transport>:<Set LAN Configuration Parameters>
+0x0C:0x02 //<Transport>:<Get LAN Configuration Parameters>
+0x2C:0x00 //<Group Extension>:<Group Extension Command>
+0x2C:0x01 //<Group Extension>:<Get DCMI Capabilities>
+0x2C:0x02 //<Group Extension>:<Get Power Reading>
+0x2C:0x03 //<Group Extension>:<Get Power Limit>
+0x2C:0x06 //<Group Extension>:<Get Asset Tag>
+0x2C:0x07 //<Group Extension>:<Get Sensor Info>
+0x2C:0x09 //<Group Extension>:<Get Management Controller Identifier String>
+0x2C:0x0A //<Group Extension>:<Set Management Controller Identifier String>
+0x2C:0x10 //<Group Extension>:<Get Temperature Readings>
+0x2C:0x12 //<Group Extension>:<Set DCMI Configuration Parameters>
+0x2C:0x13 //<Group Extension>:<Get DCMI Configuration Parameters>
+0x2C:0x3E //<Group Extension>:<Get HPM.x Capabilities>
+0x2E:0x02 //<Google OEM>:<I2C via Proxy Adapter>
+0x2E:0x04 //<Google OEM>:<Fan Manual Control Mode>
+0x2E:0x30 //<Google OEM>:<Ethernet Statistics>
+0x2E:0x32 //<Google OEM>:<Sys Commands>
+0x2E:0x80 //<Google OEM>:<Blob Commands>
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend
new file mode 100644
index 000000000..bf2986c47
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-host_%.bbappend
@@ -0,0 +1,18 @@
+DEPENDS_append_gbs = " gbs-yaml-config"
+
+SRC_URI_remove_gbs = "git://github.com/openbmc/phosphor-host-ipmid"
+SRC_URI_prepend_gbs = "git://github.com/quanta-bmc/phosphor-host-ipmid.git"
+
+SRCREV_gbs = "257ea262809c52e51f1f592e047d27125f0273b3"
+
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
+SRC_URI_append_gbs = " file://gbs-ipmid-whitelist.conf \
+ file://0063-Save-the-pre-timeout-interrupt-in-dbus-property.patch \
+ "
+
+WHITELIST_CONF_gbs = "${WORKDIR}/gbs-ipmid-whitelist.conf"
+
+EXTRA_OECONF_append_gbs = " --with-journal-sel \
+ SENSOR_YAML_GEN=${STAGING_DIR_HOST}${datadir}/gbs-yaml-config/ipmi-sensors.yaml \
+ FRU_YAML_GEN=${STAGING_DIR_HOST}${datadir}/gbs-yaml-config/ipmi-fru-read.yaml \
+ "
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-kcs/99-ipmi-kcs.rules b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-kcs/99-ipmi-kcs.rules
new file mode 100644
index 000000000..1de5562c3
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-kcs/99-ipmi-kcs.rules
@@ -0,0 +1 @@
+KERNEL=="ipmi-kcs1", SYMLINK+="ipmi_kcs1"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-kcs_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-kcs_%.bbappend
new file mode 100644
index 000000000..a7f60d4cc
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/ipmi/phosphor-ipmi-kcs_%.bbappend
@@ -0,0 +1,9 @@
+KCS_DEVICE_gbs = "ipmi_kcs1"
+
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
+SRC_URI_append_gbs = " file://99-ipmi-kcs.rules"
+
+do_install_append_gbs() {
+ install -d ${D}/lib/udev/rules.d
+ install -m 0644 ${WORKDIR}/99-ipmi-kcs.rules ${D}/lib/udev/rules.d
+}
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/leds/gbs-led-manager-config-native.bb b/meta-quanta/meta-gbs/recipes-phosphor/leds/gbs-led-manager-config-native.bb
new file mode 100644
index 000000000..03b562002
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/leds/gbs-led-manager-config-native.bb
@@ -0,0 +1,19 @@
+SUMMARY = "Phosphor LED Group Management for GBS"
+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"
+S = "${WORKDIR}"
+
+# Overwrite the example led layout yaml file prior
+# to building the phosphor-led-manager package
+do_install() {
+ SRC=${S}
+ DEST=${D}${datadir}/phosphor-led-manager
+ install -D ${SRC}/led.yaml ${DEST}/led.yaml
+}
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/leds/gbs-led-manager-config/led.yaml b/meta-quanta/meta-gbs/recipes-phosphor/leds/gbs-led-manager-config/led.yaml
new file mode 100644
index 000000000..411e0d4c6
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/leds/gbs-led-manager-config/led.yaml
@@ -0,0 +1,239 @@
+bmc_booted:
+ heartbeat:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 1000
+
+enclosure_identify:
+ attention:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 1000
+
+enclosure_fault:
+ bmc_fault:
+ Action: 'On'
+ DutyOn: 50
+ Period: 0
+ Priority: 'Blink'
+
+boot_status_inactive:
+ sys_boot_status:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 1000
+
+boot_status_standby:
+ sys_boot_status:
+ Action: 'On'
+ Period: 1000
+
+led_u2_0_locate:
+ led_u2_0_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_0_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_1_locate:
+ led_u2_1_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_1_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_2_locate:
+ led_u2_2_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_2_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_3_locate:
+ led_u2_3_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_3_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_4_locate:
+ led_u2_4_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_4_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_5_locate:
+ led_u2_5_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_5_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_6_locate:
+ led_u2_6_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_6_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_7_locate:
+ led_u2_7_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_7_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_8_locate:
+ led_u2_8_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_8_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_9_locate:
+ led_u2_9_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_9_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_10_locate:
+ led_u2_10_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_10_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_11_locate:
+ led_u2_11_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_11_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_12_locate:
+ led_u2_12_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_12_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_13_locate:
+ led_u2_13_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_13_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_14_locate:
+ led_u2_14_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_14_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+led_u2_15_locate:
+ led_u2_15_locate:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+ led_u2_15_fault:
+ Action: 'Blink'
+ DutyOn: 50
+ Period: 250
+
+led_u2_0_fault:
+ led_u2_0_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_1_fault:
+ led_u2_1_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_2_fault:
+ led_u2_2_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_3_fault:
+ led_u2_3_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_4_fault:
+ led_u2_4_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_5_fault:
+ led_u2_5_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_6_fault:
+ led_u2_6_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_7_fault:
+ led_u2_7_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_8_fault:
+ led_u2_8_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_9_fault:
+ led_u2_9_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_10_fault:
+ led_u2_10_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_11_fault:
+ led_u2_11_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_12_fault:
+ led_u2_12_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_13_fault:
+ led_u2_13_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_14_fault:
+ led_u2_14_fault:
+ Action: 'On'
+ Period: 1000
+led_u2_15_fault:
+ led_u2_15_fault:
+ Action: 'On'
+ Period: 1000 \ No newline at end of file
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/network/phosphor-network_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/network/phosphor-network_%.bbappend
new file mode 100644
index 000000000..49959cc0e
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/network/phosphor-network_%.bbappend
@@ -0,0 +1 @@
+EXTRA_OECONF_append_gbs = " --enable-nic-ethtool=yes"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/packagegroups/packagegroup-gbs-apps.bb b/meta-quanta/meta-gbs/recipes-phosphor/packagegroups/packagegroup-gbs-apps.bb
new file mode 100644
index 000000000..4c1bb123c
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/packagegroups/packagegroup-gbs-apps.bb
@@ -0,0 +1,36 @@
+SUMMARY = "OpenBMC for GBS system - Applications"
+PR = "r1"
+
+inherit packagegroup
+
+PROVIDES = "${PACKAGES}"
+PACKAGES = " \
+ ${PN}-chassis \
+ ${PN}-fans \
+ ${PN}-flash \
+ "
+
+PROVIDES += "virtual/obmc-chassis-mgmt"
+PROVIDES += "virtual/obmc-fan-mgmt"
+PROVIDES += "virtual/obmc-flash-mgmt"
+
+RPROVIDES_${PN}-chassis += "virtual-obmc-chassis-mgmt"
+RPROVIDES_${PN}-fans += "virtual-obmc-fan-mgmt"
+RPROVIDES_${PN}-flash += "virtual-obmc-flash-mgmt"
+
+SUMMARY_${PN}-chassis = "GBS Chassis"
+RDEPENDS_${PN}-chassis = " \
+ x86-power-control \
+ "
+
+SUMMARY_${PN}-fans = "GBS Fans"
+RDEPENDS_${PN}-fans = " \
+ phosphor-pid-control \
+ "
+
+SUMMARY_${PN}-flash = "GBS Flash"
+RDEPENDS_${PN}-flash = " \
+ phosphor-ipmi-flash \
+ gbs-bmc-update \
+ gbs-bios-update \
+ "
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/packagegroups/packagegroup-obmc-apps%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/packagegroups/packagegroup-obmc-apps%.bbappend
new file mode 100644
index 000000000..935c3cebb
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/packagegroups/packagegroup-obmc-apps%.bbappend
@@ -0,0 +1,2 @@
+RDEPENDS_${PN}-extras_remove_gbs = "obmc-ikvm"
+RDEPENDS_${PN}-inventory_append_gbs = " virtual/obmc-gpio-presence"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sel-logger/phosphor-sel-logger_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/sel-logger/phosphor-sel-logger_%.bbappend
new file mode 100644
index 000000000..e0f8e08aa
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sel-logger/phosphor-sel-logger_%.bbappend
@@ -0,0 +1,5 @@
+SRC_URI_gbs := "git://github.com/quanta-bmc/phosphor-sel-logger.git"
+SRCREV_gbs := "6ded68355db28958836aedb40c0d4780d84d2b43"
+
+# Enable threshold monitoring
+EXTRA_OECMAKE_append_gbs = "-DSEL_LOGGER_MONITOR_THRESHOLD_EVENTS=ON"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/0001-lev-add-poweron-monitor-feature.patch b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/0001-lev-add-poweron-monitor-feature.patch
new file mode 100644
index 000000000..c279e0b81
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/0001-lev-add-poweron-monitor-feature.patch
@@ -0,0 +1,257 @@
+From 2cea5d289b278db4468b16bf6b64102655811fd0 Mon Sep 17 00:00:00 2001
+From: Eddielu <Eddie.Lu@quantatw.com>
+Date: Mon, 27 Jul 2020 20:30:22 +0800
+Subject: [PATCH] Update lev-add-poweron-monitor-feature patch.
+
+---
+ Makefile.am | 2 ++
+ mainloop.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ sensor.cpp | 11 ++++++-
+ sensor.hpp | 13 ++++++++
+ thresholds.hpp | 2 --
+ 5 files changed, 127 insertions(+), 3 deletions(-)
+
+diff --git a/Makefile.am b/Makefile.am
+index 706a6cc..c620fa4 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -46,6 +46,7 @@ libhwmon_la_LIBADD = \
+ $(SDEVENTPLUS_LIBS) \
+ $(PHOSPHOR_DBUS_INTERFACES_LIBS) \
+ $(PHOSPHOR_LOGGING_LIBS) \
++ $(PTHREAD_LIBS) \
+ $(GPIOPLUS_LIBS) \
+ $(STDPLUS_LIBS) \
+ $(CODE_COVERAGE_LIBS) \
+@@ -55,6 +56,7 @@ libhwmon_la_CXXFLAGS = \
+ $(SDEVENTPLUS_CFLAGS) \
+ $(PHOSPHOR_DBUS_INTERFACES_CFLAGS) \
+ $(PHOSPHOR_LOGGING_CFLAGS) \
++ $(PTHREAD_CFLAGS) \
+ $(STDPLUS_CFLAGS) \
+ $(CODE_COVERAGE_CXXFLAGS)
+
+diff --git a/mainloop.cpp b/mainloop.cpp
+index 3e7e0bf..4789a80 100644
+--- a/mainloop.cpp
++++ b/mainloop.cpp
+@@ -41,6 +41,12 @@
+ #include <string>
+ #include <unordered_set>
+ #include <xyz/openbmc_project/Sensor/Device/error.hpp>
++#include <boost/container/flat_map.hpp>
++#include <boost/algorithm/string/predicate.hpp>
++#include <sdbusplus/asio/connection.hpp>
++#include <sdbusplus/asio/object_server.hpp>
++#include <sdbusplus/message/types.hpp>
++#include <sdbusplus/timer.hpp>
+
+ using namespace phosphor::logging;
+
+@@ -76,6 +82,12 @@ decltype(
+ Thresholds<CriticalObject>::alarmHi) Thresholds<CriticalObject>::alarmHi =
+ &CriticalObject::criticalAlarmHigh;
+
++static std::unique_ptr<phosphor::Timer> cacheTimer = nullptr;
++static std::unique_ptr<sdbusplus::bus::match::match> powerMatch = nullptr;
++static bool powerStatusOn = false;
++static boost::asio::io_service io;
++static auto conn = std::make_shared<sdbusplus::asio::connection>(io);
++
+ void updateSensorInterfaces(InterfaceMap& ifaces, SensorValueType value)
+ {
+ for (auto& iface : ifaces)
+@@ -103,6 +115,84 @@ void updateSensorInterfaces(InterfaceMap& ifaces, SensorValueType value)
+ }
+ }
+
++void powerStatusSet()
++{
++ powerStatusOn = true;
++ return;
++}
++
++void createTimer()
++{
++ if (cacheTimer == nullptr)
++ {
++ cacheTimer = std::make_unique<phosphor::Timer>(powerStatusSet);
++ }
++}
++
++bool isPowerOn(void)
++{
++ if (!powerMatch)
++ {
++ throw std::runtime_error("Power Match Not Created");
++ }
++ return powerStatusOn;
++}
++
++void setupPowerMatch(sdbusplus::bus::bus& bus)
++{
++ if (powerMatch)
++ {
++ return;
++ }
++
++ powerMatch = std::make_unique<sdbusplus::bus::match::match>(
++ bus,
++ "type='signal',interface='org.freedesktop.DBus.Properties',path='/xyz/"
++ "openbmc_project/state/"
++ "host0',arg0='xyz.openbmc_project.State.Host'",
++ [](sdbusplus::message::message& message) {
++ std::string objectName;
++ boost::container::flat_map<std::string, std::variant<std::string>>
++ values;
++ message.read(objectName, values);
++ auto findState = values.find("CurrentHostState");
++ if (findState != values.end())
++ {
++ bool on = boost::ends_with(
++ std::get<std::string>(findState->second), "Running");
++ if (!on)
++ {
++ cacheTimer->stop();
++ powerStatusOn = false;
++ return;
++ }
++ cacheTimer->start(std::chrono::duration_cast<std::chrono::microseconds>(
++ std::chrono::seconds(10)));
++ }
++ else {
++ powerStatusOn = false;
++ }
++ });
++
++ conn->async_method_call(
++ [](boost::system::error_code ec,
++ const std::variant<std::string>& state) {
++ if (ec)
++ {
++ return;
++ }
++ powerStatusOn =
++ boost::ends_with(std::get<std::string>(state), "Running");
++ },
++ "xyz.openbmc_project.State.Host",
++ "/xyz/openbmc_project/state/host0",
++ "org.freedesktop.DBus.Properties", "Get",
++ "xyz.openbmc_project.State.Host", "CurrentHostState");
++
++ createTimer();
++}
++
++
+ std::string MainLoop::getID(SensorSet::container_t::const_reference sensor)
+ {
+ std::string id;
+@@ -384,6 +474,7 @@ void MainLoop::init()
+ _interval = std::strtoull(interval.c_str(), NULL, 10);
+ }
+ }
++ setupPowerMatch(_bus);
+ }
+
+ void MainLoop::read()
+@@ -428,6 +519,12 @@ void MainLoop::read()
+
+ try
+ {
++ if(sensor->pwrOnMonitor() && !isPowerOn())
++ {
++ statusIface->functional(false);
++ continue;
++ }
++
+ if (sensor->hasFaultFile())
+ {
+ auto fault = _ioAccess->read(sensorSysfsType, sensorSysfsNum,
+@@ -490,6 +587,11 @@ void MainLoop::read()
+ }
+ }
+
++ if(sensor->pwrOnMonitor() && !isPowerOn())
++ {
++ statusIface->functional(false);
++ continue;
++ }
+ updateSensorInterfaces(obj, value);
+ }
+ catch (const std::system_error& e)
+diff --git a/sensor.cpp b/sensor.cpp
+index 09aeca6..b1cb470 100644
+--- a/sensor.cpp
++++ b/sensor.cpp
+@@ -31,7 +31,7 @@ Sensor::Sensor(const SensorSet::key_type& sensor,
+ const hwmonio::HwmonIOInterface* ioAccess,
+ const std::string& devPath) :
+ _sensor(sensor),
+- _ioAccess(ioAccess), _devPath(devPath), _scale(0), _hasFaultFile(false)
++ _ioAccess(ioAccess), _devPath(devPath), _scale(0), _hasFaultFile(false), _pwrOnMonitor(false)
+ {
+ auto chip = env::getEnv("GPIOCHIP", sensor);
+ auto access = env::getEnv("GPIO", sensor);
+@@ -60,6 +60,15 @@ Sensor::Sensor(const SensorSet::key_type& sensor,
+ auto senRmRCs = env::getEnv("REMOVERCS", sensor);
+ // Add sensor removal return codes defined per sensor
+ addRemoveRCs(senRmRCs);
++
++ auto pwrOnMon = env::getEnv("PWRONMON", sensor);
++ if (!pwrOnMon.empty())
++ {
++ if (pwrOnMon == "ON")
++ {
++ _pwrOnMonitor = true;
++ }
++ }
+ }
+
+ void Sensor::addRemoveRCs(const std::string& rcList)
+diff --git a/sensor.hpp b/sensor.hpp
+index 4b2d281..369a252 100644
+--- a/sensor.hpp
++++ b/sensor.hpp
+@@ -135,6 +135,16 @@ class Sensor
+ return _hasFaultFile;
+ }
+
++ /**
++ * @brief Get whether the sensor only need to be monitored in power on state or not.
++ *
++ * @return - Boolean on whether the sensor only need to be monitored in power on state
++ */
++ inline bool pwrOnMonitor(void) const
++ {
++ return _pwrOnMonitor;
++ }
++
+ private:
+ /** @brief Sensor object's identifiers */
+ SensorSet::key_type _sensor;
+@@ -156,6 +166,9 @@ class Sensor
+
+ /** @brief Tracks whether the sensor has a fault file or not. */
+ bool _hasFaultFile;
++
++ /** @brief Whether the sensor only need to be monitored in power on state or not. */
++ bool _pwrOnMonitor;
+ };
+
+ /**
+diff --git a/thresholds.hpp b/thresholds.hpp
+index 4d2fcff..972a469 100644
+--- a/thresholds.hpp
++++ b/thresholds.hpp
+@@ -101,8 +101,6 @@ auto addThreshold(const std::string& sensorType, const std::string& sensorID,
+ auto hi = stod(tHi) * std::pow(10, scale);
+ (*iface.*Thresholds<T>::setLo)(lo);
+ (*iface.*Thresholds<T>::setHi)(hi);
+- (*iface.*Thresholds<T>::alarmLo)(value <= lo);
+- (*iface.*Thresholds<T>::alarmHi)(value >= hi);
+ auto type = Thresholds<T>::type;
+ obj[type] = iface;
+ }
+--
+2.7.4
+
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/0002-lev-add-sensors-slow-readings.patch b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/0002-lev-add-sensors-slow-readings.patch
new file mode 100644
index 000000000..0ab2f2048
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/0002-lev-add-sensors-slow-readings.patch
@@ -0,0 +1,295 @@
+From 8eafa1b0513dd2f5898182487b4524a485bf1e21 Mon Sep 17 00:00:00 2001
+From: Eddielu <Eddie.Lu@quantatw.com>
+Date: Mon, 27 Jul 2020 20:54:28 +0800
+Subject: [PATCH] Update add sensors slow readings patch.
+
+---
+ mainloop.cpp | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----
+ mainloop.hpp | 3 +++
+ meson.build | 1 +
+ sensor.cpp | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------
+ sensor.hpp | 20 ++++++++++++++--
+ 5 files changed, 158 insertions(+), 14 deletions(-)
+
+diff --git a/mainloop.cpp b/mainloop.cpp
+index 4789a80..98d0658 100644
+--- a/mainloop.cpp
++++ b/mainloop.cpp
+@@ -34,6 +34,7 @@
+ #include <cassert>
+ #include <cstdlib>
+ #include <functional>
++#include <future>
+ #include <iostream>
+ #include <memory>
+ #include <phosphor-logging/elog-errors.hpp>
+@@ -299,7 +300,7 @@ std::optional<ObjectStateData>
+ {
+ // Add status interface based on _fault file being present
+ sensorObj->addStatus(info);
+- valueInterface = sensorObj->addValue(retryIO, info);
++ valueInterface = sensorObj->addValue(retryIO, info, _timedoutMap);
+ }
+ catch (const std::system_error& e)
+ {
+@@ -542,10 +543,74 @@ void MainLoop::read()
+ // RAII object for GPIO unlock / lock
+ auto locker = sensor::gpioUnlock(sensor->getGpio());
+
+- // Retry for up to a second if device is busy
+- // or has a transient error.
+- value = _ioAccess->read(sensorSysfsType, sensorSysfsNum, input,
++ // For sensors with attribute ASYNC_READ_TIMEOUT,
++ // spawn a thread with timeout
++ auto asyncRead =
++ env::getEnv("ASYNC_READ_TIMEOUT", sensorSetKey);
++ if (!asyncRead.empty())
++ {
++ // Default async read timeout
++ std::chrono::milliseconds asyncReadTimeout{
++ std::stoi(asyncRead)};
++ bool valueIsValid = false;
++ std::future<int64_t> asyncThread;
++
++ auto asyncIter = _timedoutMap.find(sensorSetKey);
++ if (asyncIter == _timedoutMap.end())
++ {
++ // If sensor not found in timedoutMap, spawn an async
++ // thread
++ asyncThread = std::async(
++ std::launch::async,
++ &hwmonio::HwmonIOInterface::read, _ioAccess,
++ sensorSysfsType, sensorSysfsNum, input,
++ hwmonio::retries, hwmonio::delay);
++ valueIsValid = true;
++ }
++ else
++ {
++ // If we already have the async thread in the
++ // timedoutMap, it means this sensor has already timed
++ // out in the previous reads. No need to wait on
++ // subsequent reads
++ asyncReadTimeout = std::chrono::seconds(0);
++ asyncThread = std::move(asyncIter->second);
++ }
++
++ std::future_status status =
++ asyncThread.wait_for(asyncReadTimeout);
++ switch (status)
++ {
++ // Read has finished
++ case std::future_status::ready:
++ // Read has finished
++ if (valueIsValid)
++ {
++ value = asyncThread.get();
++ break;
++ // Good sensor reads should skip the code below
++ }
++ // Async read thread has completed, erase from
++ // timedoutMap to allow retry then throw
++ _timedoutMap.erase(sensorSetKey);
++ throw sensor::AsyncSensorReadTimeOut();
++ default:
++ // Read timed out so add the thread to the
++ // timedoutMap (if the entry already exists,
++ // operator[] updates it)
++ _timedoutMap[sensorSetKey] = std::move(asyncThread);
++ throw sensor::AsyncSensorReadTimeOut();
++ }
++ }
++ else
++ {
++ // Retry for up to a second if device is busy
++ // or has a transient error.
++ value =
++ _ioAccess->read(sensorSysfsType, sensorSysfsNum, input,
+ hwmonio::retries, hwmonio::delay);
++ }
++
+ // Set functional property to true if we could read sensor
+ statusIface->functional(true);
+
+diff --git a/mainloop.hpp b/mainloop.hpp
+index b3de022..6803c4b 100644
+--- a/mainloop.hpp
++++ b/mainloop.hpp
+@@ -9,6 +9,7 @@
+ #include "types.hpp"
+
+ #include <any>
++#include <future>
+ #include <memory>
+ #include <optional>
+ #include <sdbusplus/server.hpp>
+@@ -116,6 +117,8 @@ class MainLoop
+ /** @brief Store the specifications of sensor objects */
+ std::map<SensorSet::key_type, std::unique_ptr<sensor::Sensor>>
+ _sensorObjects;
++ /** @brief Store the async futures of timed out sensor objects */
++ std::map<SensorSet::key_type, std::future<int64_t>> _timedoutMap;
+
+ /**
+ * @brief Map of removed sensors
+diff --git a/meson.build b/meson.build
+index 66e6801..d6a92f8 100644
+--- a/meson.build
++++ b/meson.build
+@@ -84,6 +84,7 @@ libhwmon_all = static_library(
+ gpioplus,
+ phosphor_dbus_interfaces,
+ phosphor_logging,
++ threads,
+ ],
+ link_with: [
+ libaverage,
+diff --git a/sensor.cpp b/sensor.cpp
+index b1cb470..72b45f8 100644
+--- a/sensor.cpp
++++ b/sensor.cpp
+@@ -15,6 +15,7 @@
+ #include <cmath>
+ #include <cstring>
+ #include <filesystem>
++#include <future>
+ #include <phosphor-logging/elog-errors.hpp>
+ #include <thread>
+ #include <xyz/openbmc_project/Common/error.hpp>
+@@ -125,8 +126,9 @@ SensorValueType Sensor::adjustValue(SensorValueType value)
+ return value;
+ }
+
+-std::shared_ptr<ValueObject> Sensor::addValue(const RetryIO& retryIO,
+- ObjectInfo& info)
++std::shared_ptr<ValueObject> Sensor::addValue(
++ const RetryIO& retryIO, ObjectInfo& info,
++ std::map<SensorSet::key_type, std::future<int64_t>>& timedoutMap)
+ {
+ static constexpr bool deferSignals = true;
+
+@@ -153,12 +155,69 @@ std::shared_ptr<ValueObject> Sensor::addValue(const RetryIO& retryIO,
+ // RAII object for GPIO unlock / lock
+ auto locker = gpioUnlock(getGpio());
+
+- // Retry for up to a second if device is busy
+- // or has a transient error.
+- val =
+- _ioAccess->read(_sensor.first, _sensor.second,
+- hwmon::entry::cinput, std::get<size_t>(retryIO),
+- std::get<std::chrono::milliseconds>(retryIO));
++ // For sensors with attribute ASYNC_READ_TIMEOUT,
++ // spawn a thread with timeout
++ auto asyncRead = env::getEnv("ASYNC_READ_TIMEOUT", _sensor);
++ if (!asyncRead.empty())
++ {
++ // Default async read timeout
++ std::chrono::milliseconds asyncReadTimeout{
++ std::stoi(asyncRead)};
++ bool valueIsValid = false;
++ std::future<int64_t> asyncThread;
++
++ auto asyncIter = timedoutMap.find(_sensor);
++ if (asyncIter == timedoutMap.end())
++ {
++ // If sensor not found in timedoutMap, spawn an async thread
++ asyncThread = std::async(
++ std::launch::async, &hwmonio::HwmonIOInterface::read,
++ _ioAccess, _sensor.first, _sensor.second,
++ hwmon::entry::cinput, std::get<size_t>(retryIO),
++ std::get<std::chrono::milliseconds>(retryIO));
++ valueIsValid = true;
++ }
++ else
++ {
++ // If we already have the async thread in the timedoutMap,
++ // it means this sensor has already timed out in the
++ // previous reads. No need to wait on subsequent reads
++ asyncReadTimeout = std::chrono::seconds(0);
++ asyncThread = std::move(asyncIter->second);
++ }
++
++ std::future_status status =
++ asyncThread.wait_for(asyncReadTimeout);
++ switch (status)
++ {
++ case std::future_status::ready:
++ // Read has finished
++ if (valueIsValid)
++ {
++ val = asyncThread.get();
++ break;
++ // Good sensor reads should skip the code below
++ }
++ // Async read thread has completed, erase from
++ // timedoutMap to allow retry then throw
++ timedoutMap.erase(_sensor);
++ throw AsyncSensorReadTimeOut();
++ default:
++ // Read timed out so add the thread to the timedoutMap
++ // (if the entry already exists, operator[] updates it)
++ timedoutMap[_sensor] = std::move(asyncThread);
++ throw AsyncSensorReadTimeOut();
++ }
++ }
++ else
++ {
++ // Retry for up to a second if device is busy
++ // or has a transient error.
++ val = _ioAccess->read(
++ _sensor.first, _sensor.second, hwmon::entry::cinput,
++ std::get<size_t>(retryIO),
++ std::get<std::chrono::milliseconds>(retryIO));
++ }
+ }
+ #ifdef UPDATE_FUNCTIONAL_ON_FAIL
+ catch (const std::system_error& e)
+diff --git a/sensor.hpp b/sensor.hpp
+index 369a252..41c0fe7 100644
+--- a/sensor.hpp
++++ b/sensor.hpp
+@@ -4,6 +4,8 @@
+ #include "sensorset.hpp"
+ #include "types.hpp"
+
++#include <cerrno>
++#include <future>
+ #include <gpioplus/handle.hpp>
+ #include <memory>
+ #include <optional>
+@@ -20,6 +22,17 @@ struct valueAdjust
+ std::unordered_set<int> rmRCs;
+ };
+
++/** @brief Custom exception for async sensor reading timeout
++ */
++struct AsyncSensorReadTimeOut : public std::system_error
++{
++ AsyncSensorReadTimeOut() :
++ system_error(std::error_code(ETIMEDOUT, std::system_category()),
++ "Async sensor read timed out")
++ {
++ }
++};
++
+ /** @class Sensor
+ * @brief Sensor object based on a SensorSet container's key type
+ * @details Sensor object to create and modify an associated device's sensor
+@@ -87,10 +100,13 @@ class Sensor
+ * (number of and delay between)
+ * @param[in] info - Sensor object information
+ *
++ * @param[in] timedoutMap - Map to track timed out threads
++ *
+ * @return - Shared pointer to the value object
+ */
+- std::shared_ptr<ValueObject> addValue(const RetryIO& retryIO,
+- ObjectInfo& info);
++ std::shared_ptr<ValueObject> addValue(
++ const RetryIO& retryIO, ObjectInfo& info,
++ std::map<SensorSet::key_type, std::future<int64_t>>& timedoutMap);
+
+ /**
+ * @brief Add status interface and functional property for sensor
+--
+2.7.4
+
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@82000/sbtsi@4c.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@82000/sbtsi@4c.conf
new file mode 100644
index 000000000..6dcada7b1
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@82000/sbtsi@4c.conf
@@ -0,0 +1,9 @@
+LABEL_temp1 = "cputemp"
+CRITHI_temp1 = "95000"
+CRITLO_temp1 = "0"
+WARNHI_temp1 = "95000"
+WARNLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
+ASYNC_READ_TIMEOUT_temp1 = "500"
+PWRONMON_temp1 = "ON"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@0/max31725@54.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@0/max31725@54.conf
new file mode 100644
index 000000000..839a7c610
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@0/max31725@54.conf
@@ -0,0 +1,8 @@
+LABEL_temp1 = "i2cool_0"
+CRITHI_temp1 = "35000"
+CRITLO_temp1 = "0"
+WARNHI_temp1 = "35000"
+WARNLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
+ASYNC_READ_TIMEOUT_temp1 = "500"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@1/max31725@55.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@1/max31725@55.conf
new file mode 100644
index 000000000..174c62b98
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@1/max31725@55.conf
@@ -0,0 +1,8 @@
+LABEL_temp1 = "i2cool_1"
+CRITHI_temp1 = "70000"
+CRITLO_temp1 = "0"
+WARNHI_temp1 = "70000"
+WARNLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
+ASYNC_READ_TIMEOUT_temp1 = "500"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@2/max31725@5d.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@2/max31725@5d.conf
new file mode 100644
index 000000000..3fb0ceeeb
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@85000/i2c-switch@71/i2c@2/max31725@5d.conf
@@ -0,0 +1,8 @@
+LABEL_temp1 = "i2cool_2"
+CRITHI_temp1 = "70000"
+CRITLO_temp1 = "0"
+WARNHI_temp1 = "70000"
+WARNLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
+ASYNC_READ_TIMEOUT_temp1 = "500"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@88000/adm1272@10.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@88000/adm1272@10.conf
new file mode 100644
index 000000000..41a53c052
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@88000/adm1272@10.conf
@@ -0,0 +1,43 @@
+LABEL_in1 = "hotswap_vin"
+CRITHI_in1 = "60000"
+CRITLO_in1 = "40000"
+WARNHI_in1 = "60000"
+WARNLO_in1 = "40000"
+MINVALUE_in1 = "0"
+MAXVALUE_in1 = "66"
+
+LABEL_in2 = "hotswap_vout"
+CRITHI_in2 = "60000"
+CRITLO_in2 = "40000"
+WARNHI_in2 = "60000"
+WARNLO_in2 = "40000"
+MINVALUE_in2 = "0"
+MAXVALUE_in2 = "66"
+
+LABEL_curr1= "hotswap_iout"
+CRITHI_curr1= "40000"
+CRITLO_curr1= "0"
+WARNHI_curr1= "40000"
+WARNLO_curr1= "0"
+MINVALUE_curr1 = "0"
+MAXVALUE_curr1 = "55"
+# READ_Iout is direct value*0.98
+GAIN_curr1 = "0.98"
+
+LABEL_power1= "hotswap_pout"
+CRITHI_power1= "1920000000"
+CRITLO_power1= "0"
+WARNHI_power1= "1920000000"
+WARNLO_power1= "0"
+MINVALUE_power1 = "0"
+MAXVALUE_power1 = "2200"
+# READ_Pout is direct value*0.98
+GAIN_power1 = "0.98"
+
+LABEL_temp1= "hotswap"
+WARNLO_temp1= "0"
+WARNHI_temp1= "125000"
+CRITHI_temp1 = "125000"
+CRITLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@0/vrm@60.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@0/vrm@60.conf
new file mode 100644
index 000000000..79397b06c
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@0/vrm@60.conf
@@ -0,0 +1,46 @@
+LABEL_in1 = "vddcr_cpu_in"
+CRITHI_in1 = "12600"
+CRITLO_in1 = "11400"
+WARNHI_in1 = "12600"
+WARNLO_in1 = "11400"
+MINVALUE_in1 = "0"
+MAXVALUE_in1 = "14"
+# READ_VIN is direct value *10
+GAIN_in1 = "10.0"
+PWRONMON_in1 = "ON"
+
+LABEL_in2 = "vddcr_cpu_out"
+CRITHI_in2 = "1300"
+CRITLO_in2 = "400"
+WARNHI_in2 = "1300"
+WARNLO_in2 = "400"
+MINVALUE_in2 = "0"
+MAXVALUE_in2 = "2"
+PWRONMON_in2 = "ON"
+
+LABEL_curr1 = "vddcr_cpu_in"
+CRITHI_curr1 = "21250"
+CRITLO_curr1 = "-4000"
+WARNHI_curr1 = "21250"
+WARNLO_curr1 = "-4000"
+MINVALUE_curr1 = "0"
+MAXVALUE_curr1 = "22"
+PWRONMON_curr1 = "ON"
+
+LABEL_curr2 = "vddcr_cpu_out"
+CRITHI_curr2 = "255000"
+CRITLO_curr2 = "-50000"
+WARNHI_curr2 = "255000"
+WARNLO_curr2 = "-50000"
+MINVALUE_curr2 = "0"
+MAXVALUE_curr2 = "256"
+PWRONMON_curr2 = "ON"
+
+LABEL_temp1= "vddcr_cpu"
+WARNLO_temp1= "0"
+WARNHI_temp1= "100000"
+CRITHI_temp1 = "100000"
+CRITLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
+PWRONMON_temp1 = "ON"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@1/vrm@61.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@1/vrm@61.conf
new file mode 100644
index 000000000..f21c32a24
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@1/vrm@61.conf
@@ -0,0 +1,46 @@
+LABEL_in1 = "vddcr_soc_in"
+CRITHI_in1 = "12600"
+CRITLO_in1 = "11400"
+WARNHI_in1 = "12600"
+WARNLO_in1 = "11400"
+MINVALUE_in1 = "0"
+MAXVALUE_in1 = "14"
+# READ_VIN is direct value *10
+GAIN_in1 = "10.0"
+PWRONMON_in1 = "ON"
+
+LABEL_in2 = "vddcr_soc_out"
+CRITHI_in2 = "1300"
+CRITLO_in2 = "500"
+WARNHI_in2 = "1300"
+WARNLO_in2 = "500"
+MINVALUE_in2 = "0"
+MAXVALUE_in2 = "2"
+PWRONMON_in2 = "ON"
+
+LABEL_curr1 = "vddcr_soc_in"
+CRITHI_curr1 = "6700"
+CRITLO_curr1 = "0"
+WARNHI_curr1 = "6700"
+WARNLO_curr1 = "0"
+MINVALUE_curr1 = "0"
+MAXVALUE_curr1 = "9"
+PWRONMON_curr1 = "ON"
+
+LABEL_curr2 = "vddcr_soc_out"
+CRITHI_curr2 = "80000"
+CRITLO_curr2 = "0"
+WARNHI_curr2 = "80000"
+WARNLO_curr2 = "0"
+MINVALUE_curr2 = "0"
+MAXVALUE_curr2 = "88"
+PWRONMON_curr2 = "ON"
+
+LABEL_temp1= "vddcr_soc"
+WARNLO_temp1= "0"
+WARNHI_temp1= "100000"
+CRITHI_temp1 = "100000"
+CRITLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
+PWRONMON_temp1 = "ON"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@2/vrm@63.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@2/vrm@63.conf
new file mode 100644
index 000000000..9cd9a129b
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@2/vrm@63.conf
@@ -0,0 +1,46 @@
+LABEL_in1 = "vddio_efgh_in"
+CRITHI_in1 = "12600"
+CRITLO_in1 = "11400"
+WARNHI_in1 = "12600"
+WARNLO_in1 = "11400"
+MINVALUE_in1 = "0"
+MAXVALUE_in1 = "14"
+# READ_VIN is direct value *10
+GAIN_in1 = "10.0"
+PWRONMON_in1 = "ON"
+
+LABEL_in2 = "vddio_efgh_out"
+CRITHI_in2 = "1320"
+CRITLO_in2 = "800"
+WARNHI_in2 = "1320"
+WARNLO_in2 = "800"
+MINVALUE_in2 = "0"
+MAXVALUE_in2 = "2"
+PWRONMON_in2 = "ON"
+
+LABEL_curr1 = "vddio_efgh_in"
+CRITHI_curr1 = "8400"
+CRITLO_curr1 = "0"
+WARNHI_curr1 = "8400"
+WARNLO_curr1 = "0"
+MINVALUE_curr1 = "0"
+MAXVALUE_curr1 = "9"
+PWRONMON_curr1 = "ON"
+
+LABEL_curr2 = "vddio_efgh_out"
+CRITHI_curr2 = "84000"
+CRITLO_curr2 = "0"
+WARNHI_curr2 = "84000"
+WARNLO_curr2 = "0"
+MINVALUE_curr2 = "0"
+MAXVALUE_curr2 = "88"
+PWRONMON_curr2 = "ON"
+
+LABEL_temp1= "vddio_efgh"
+WARNLO_temp1= "0"
+WARNHI_temp1= "100000"
+CRITHI_temp1 = "100000"
+CRITLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
+PWRONMON_temp1 = "ON"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@3/vrm@45.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@3/vrm@45.conf
new file mode 100644
index 000000000..762af173b
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@89000/i2c-switch@71/i2c@3/vrm@45.conf
@@ -0,0 +1,46 @@
+LABEL_in1 = "vddio_abcd_in"
+CRITHI_in1 = "12600"
+CRITLO_in1 = "11400"
+WARNHI_in1 = "12600"
+WARNLO_in1 = "11400"
+MINVALUE_in1 = "0"
+MAXVALUE_in1 = "14"
+# READ_VIN is direct value *10
+GAIN_in1 = "10.0"
+PWRONMON_in1 = "ON"
+
+LABEL_in2 = "vddio_abcd_out"
+CRITHI_in2 = "1320"
+CRITLO_in2 = "800"
+WARNHI_in2 = "1320"
+WARNLO_in2 = "800"
+MINVALUE_in2 = "0"
+MAXVALUE_in2 = "2"
+PWRONMON_in2 = "ON"
+
+LABEL_curr1 = "vddio_abcd_in"
+CRITHI_curr1 = "8400"
+CRITLO_curr1 = "0"
+WARNHI_curr1 = "8400"
+WARNLO_curr1 = "0"
+MINVALUE_curr1 = "0"
+MAXVALUE_curr1 = "9"
+PWRONMON_curr1 = "ON"
+
+LABEL_curr2 = "vddio_abcd_out"
+CRITHI_curr2 = "84000"
+CRITLO_curr2 = "0"
+WARNHI_curr2 = "84000"
+WARNLO_curr2 = "0"
+MINVALUE_curr2 = "0"
+MAXVALUE_curr2 = "88"
+PWRONMON_curr2 = "ON"
+
+LABEL_temp1= "vddio_abcd"
+WARNLO_temp1= "0"
+WARNHI_temp1= "100000"
+CRITHI_temp1 = "100000"
+CRITLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
+PWRONMON_temp1 = "ON"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/max34451@4e.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/max34451@4e.conf
new file mode 100644
index 000000000..9a8a80390
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/max34451@4e.conf
@@ -0,0 +1,119 @@
+LABEL_in1 = "p1v8_stby"
+CRITHI_in1 = "1890"
+CRITLO_in1 = "1710"
+WARNHI_in1 = "1890"
+WARNLO_in1 = "1710"
+MINVALUE_in1 = "0"
+MAXVALUE_in1 = "2"
+PWRONMON_in1 = "ON"
+
+LABEL_in2 = "vddcr_soc_stby"
+CRITHI_in2 = "945"
+CRITLO_in2 = "855"
+WARNHI_in2 = "945"
+WARNLO_in2 = "855"
+MINVALUE_in2 = "0"
+MAXVALUE_in2 = "1"
+PWRONMON_in2 = "ON"
+
+LABEL_in3 = "p2v5_stby"
+CRITHI_in3 = "2625"
+CRITLO_in3 = "2375"
+WARNHI_in3 = "2625"
+WARNLO_in3 = "2375"
+MINVALUE_in3 = "0"
+MAXVALUE_in3 = "3"
+PWRONMON_in3 = "ON"
+
+LABEL_in4 = "p1v2_stby"
+CRITHI_in4 = "1260"
+CRITLO_in4 = "1140"
+WARNHI_in4 = "1260"
+WARNLO_in4 = "1140"
+MINVALUE_in4 = "0"
+MAXVALUE_in4 = "2"
+PWRONMON_in4 = "ON"
+
+LABEL_in5 = "p1v175_stby"
+CRITHI_in5 = "1234"
+CRITLO_in5 = "1116"
+WARNHI_in5 = "1234"
+WARNLO_in5 = "1116"
+MINVALUE_in5 = "0"
+MAXVALUE_in5 = "2"
+PWRONMON_in5 = "ON"
+
+LABEL_in6 = "p1v8"
+CRITHI_in6 = "1890"
+CRITLO_in6 = "1710"
+WARNHI_in6 = "1890"
+WARNLO_in6 = "1710"
+MINVALUE_in6 = "0"
+MAXVALUE_in6 = "2"
+PWRONMON_in6 = "ON"
+
+LABEL_in7 = "p3v3"
+CRITHI_in7 = "3465"
+CRITLO_in7 = "3135"
+WARNHI_in7 = "3465"
+WARNLO_in7 = "3135"
+MINVALUE_in7 = "0"
+MAXVALUE_in7 = "4"
+PWRONMON_in7 = "ON"
+
+LABEL_in8 = "pwrgd_pvpp"
+CRITHI_in8 = "5760"
+CRITLO_in8 = "1600"
+WARNHI_in8 = "5760"
+WARNLO_in8 = "1600"
+MINVALUE_in8 = "0"
+MAXVALUE_in8 = "6"
+PWRONMON_in8 = "ON"
+GAIN_in8 = "1.60"
+
+LABEL_in9 = "pwrgd_pvddio"
+CRITHI_in9 = "5760"
+CRITLO_in9 = "1600"
+WARNHI_in9 = "5760"
+WARNLO_in9 = "1600"
+MINVALUE_in9 = "0"
+MAXVALUE_in9 = "6"
+PWRONMON_in9 = "ON"
+GAIN_in9 = "1.60"
+
+LABEL_in10 = "pwrgd_cpuvr"
+CRITHI_in10 = "5760"
+CRITLO_in10 = "1600"
+WARNHI_in10 = "5760"
+WARNLO_in10 = "1600"
+MINVALUE_in10 = "0"
+MAXVALUE_in10 = "6"
+PWRONMON_in10 = "ON"
+GAIN_in10 = "1.60"
+
+LABEL_in11 = "p3v3_stby"
+CRITHI_in11 = "3465"
+CRITLO_in11 = "3135"
+WARNHI_in11 = "3465"
+WARNLO_in11 = "3135"
+MINVALUE_in11 = "0"
+MAXVALUE_in11 = "4"
+PWRONMON_in11 = "ON"
+
+LABEL_in12 = "p5v_stby"
+CRITHI_in12 = "5250"
+CRITLO_in12 = "4750"
+WARNHI_in12 = "5250"
+WARNLO_in12 = "4750"
+MINVALUE_in12 = "0"
+MAXVALUE_in12 = "6"
+PWRONMON_in12 = "ON"
+
+LABEL_temp1 = "powerseq_temp"
+CRITHI_temp1 = "99000"
+CRITLO_temp1 = "0"
+WARNHI_temp1 = "99000"
+WARNLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
+ASYNC_READ_TIMEOUT_temp1 = "500"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/vrm@5d.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/vrm@5d.conf
new file mode 100644
index 000000000..427cdabe0
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/vrm@5d.conf
@@ -0,0 +1,50 @@
+LABEL_in1 = "p12v_fan_in"
+CRITHI_in1 = "60000"
+CRITLO_in1 = "40000"
+WARNHI_in1 = "60000"
+WARNLO_in1 = "40000"
+MINVALUE_in1 = "0"
+MAXVALUE_in1 = "65"
+# READ_VIN is direct value*100
+GAIN_in1 = "100.0"
+PWRONMON_in1 = "ON"
+
+LABEL_in2 = "p12v_fan_out"
+CRITHI_in2 = "12600"
+CRITLO_in2 = "11400"
+WARNHI_in2 = "12600"
+WARNLO_in2 = "11400"
+MINVALUE_in2 = "0"
+MAXVALUE_in2 = "14"
+# READ_VOUT is direct value*5.02
+GAIN_in2 = "5.02"
+PWRONMON_in2 = "ON"
+
+LABEL_curr1 = "p12v_fan_in"
+CRITHI_curr1 = "30000"
+CRITLO_curr1 = "0"
+WARNHI_curr1 = "30000"
+WARNLO_curr1 = "0"
+MINVALUE_curr1 = "0"
+MAXVALUE_curr1 = "35"
+# READ_Iin is direct value*0.5
+GAIN_curr1 = "0.5"
+PWRONMON_curr1 = "ON"
+
+LABEL_curr2 = "p12v_fan_out"
+CRITHI_curr2 = "100000"
+CRITLO_curr2 = "0"
+WARNHI_curr2 = "100000"
+WARNLO_curr2 = "0"
+MINVALUE_curr2 = "0"
+MAXVALUE_curr2 = "150"
+PWRONMON_curr2 = "ON"
+
+LABEL_temp1= "p12v_fan"
+WARNLO_temp1= "0"
+WARNHI_temp1= "114000"
+CRITHI_temp1 = "114000"
+CRITLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
+PWRONMON_temp1 = "ON"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/vrm@5e.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/vrm@5e.conf
new file mode 100644
index 000000000..c1612d13b
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/i2c@8c000/vrm@5e.conf
@@ -0,0 +1,50 @@
+LABEL_in1 = "p12v_mobo_in"
+CRITHI_in1 = "60000"
+CRITLO_in1 = "40000"
+WARNHI_in1 = "60000"
+WARNLO_in1 = "40000"
+MINVALUE_in1 = "0"
+MAXVALUE_in1 = "65"
+# READ_VIN is direct value*100
+GAIN_in1 = "100.0"
+PWRONMON_in1 = "ON"
+
+LABEL_in2 = "p12v_mobo_out"
+CRITHI_in2 = "12600"
+CRITLO_in2 = "11400"
+WARNHI_in2 = "12600"
+WARNLO_in2 = "11400"
+MINVALUE_in2 = "0"
+MAXVALUE_in2 = "14"
+# READ_VOUT is direct value*5.02
+GAIN_in2 = "5.02"
+PWRONMON_in2 = "ON"
+
+LABEL_curr1 = "p12v_mobo_in"
+CRITHI_curr1 = "30000"
+CRITLO_curr1 = "0"
+WARNHI_curr1 = "30000"
+WARNLO_curr1 = "0"
+MINVALUE_curr1 = "0"
+MAXVALUE_curr1 = "35"
+# READ_Iin is direct value*0.5
+GAIN_curr1 = "0.5"
+PWRONMON_curr1 = "ON"
+
+LABEL_curr2 = "p12v_mobo_out"
+CRITHI_curr2 = "100000"
+CRITLO_curr2 = "0"
+WARNHI_curr2 = "100000"
+WARNLO_curr2 = "0"
+MINVALUE_curr2 = "0"
+MAXVALUE_curr2 = "150"
+PWRONMON_curr2 = "ON"
+
+LABEL_temp1= "p12v_mobo"
+WARNLO_temp1= "0"
+WARNHI_temp1= "114000"
+CRITHI_temp1 = "114000"
+CRITLO_temp1 = "0"
+MINVALUE_temp1 = "-128"
+MAXVALUE_temp1 = "127"
+PWRONMON_temp1 = "ON"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/pwm-fan-controller@103000.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/pwm-fan-controller@103000.conf
new file mode 100644
index 000000000..1a8fafb08
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/pwm-fan-controller@103000.conf
@@ -0,0 +1,44 @@
+LABEL_fan1= "fan0"
+WARNHI_fan1= "19800"
+WARNLO_fan1= "600"
+CRITHI_fan1= "19800"
+CRITLO_fan1= "600"
+MINVALUE_fan1 = "0"
+MAXVALUE_fan1 = "20775"
+PWM_TARGET_fan1 = 1
+
+LABEL_fan2= "fan1"
+WARNHI_fan2= "19800"
+WARNLO_fan2= "600"
+CRITHI_fan2= "19800"
+CRITLO_fan2= "600"
+MINVALUE_fan2 = "0"
+MAXVALUE_fan2 = "20775"
+PWM_TARGET_fan2 = 2
+
+LABEL_fan3= "fb_fan0"
+WARNHI_fan3= "19800"
+WARNLO_fan3= "600"
+CRITHI_fan3= "19800"
+CRITLO_fan3= "600"
+MINVALUE_fan3 = "0"
+MAXVALUE_fan3 = "20775"
+PWM_TARGET_fan3 = 3
+
+LABEL_fan4= "fb_fan1"
+WARNHI_fan4= "19800"
+WARNLO_fan4= "600"
+CRITHI_fan4= "19800"
+CRITLO_fan4= "600"
+MINVALUE_fan4 = "0"
+MAXVALUE_fan4 = "20775"
+PWM_TARGET_fan4 = 4
+
+LABEL_fan5= "fb_fan2"
+WARNHI_fan5= "19800"
+WARNLO_fan5= "600"
+CRITHI_fan5= "19800"
+CRITLO_fan5= "600"
+MINVALUE_fan5 = "0"
+MAXVALUE_fan5 = "20775"
+PWM_TARGET_fan5 = 5
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/iio-hwmon-battery.conf b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/iio-hwmon-battery.conf
new file mode 100644
index 000000000..4ae5a24eb
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/iio-hwmon-battery.conf
@@ -0,0 +1,15 @@
+LABEL_in1 = "p3v_bat_adc"
+CRITLO_in1 = "2690"
+CRITHI_in1 = "3480"
+WARNHI_in1 = "3480"
+WARNLO_in1 = "2690"
+MINVALUE_in1 = "0"
+MAXVALUE_in1 = "4"
+
+# The battery read is controlled by GPIO18
+GPIOCHIP_in1=0
+GPIO_in1=18
+GAIN_in1 = "3.14"
+
+# Sleep 24hrs per poll. Number is in microseconds.
+INTERVAL=86400000000
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon_%.bbappend
new file mode 100644
index 000000000..c779b85e0
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-hwmon_%.bbappend
@@ -0,0 +1,35 @@
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
+
+SRC_URI_append_gbs = " file://0001-lev-add-poweron-monitor-feature.patch \
+ file://0002-lev-add-sensors-slow-readings.patch \
+ "
+
+GBS_NAMES = " \
+ i2c@82000/sbtsi@4c \
+ i2c@85000/i2c-switch@71/i2c@0/max31725@54 \
+ i2c@85000/i2c-switch@71/i2c@1/max31725@55 \
+ i2c@85000/i2c-switch@71/i2c@2/max31725@5d \
+ i2c@88000/adm1272@10 \
+ i2c@89000/i2c-switch@71/i2c@0/vrm@60 \
+ i2c@89000/i2c-switch@71/i2c@1/vrm@61 \
+ i2c@89000/i2c-switch@71/i2c@2/vrm@63 \
+ i2c@89000/i2c-switch@71/i2c@3/vrm@45 \
+ i2c@8c000/max34451@4e \
+ i2c@8c000/vrm@5d \
+ i2c@8c000/vrm@5e \
+ "
+GBS_ITEMSFMT = "ahb/apb/{0}.conf"
+
+GBS_ITEMS += "${@compose_list(d, 'GBS_ITEMSFMT', 'GBS_NAMES')}"
+GBS_ITEMS_append_gbs += " iio-hwmon-battery.conf"
+
+ENVS = "obmc/hwmon/{0}"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs = " ${@compose_list(d, 'ENVS', 'GBS_ITEMS')}"
+
+# Fan sensors
+FITEMS = "pwm-fan-controller@103000.conf"
+FENVS = "obmc/hwmon/ahb/apb/{0}"
+SYSTEMD_ENVIRONMENT_FILE_${PN}_append_gbs = " ${@compose_list(d, 'FENVS', 'FITEMS')}"
+
+
+EXTRA_OECONF_append_gbs = " --enable-update-functional-on-fail"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/nvme_config.json b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/nvme_config.json
new file mode 100644
index 000000000..306e74e2a
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/nvme_config.json
@@ -0,0 +1,174 @@
+{
+ "config": [
+ {
+ "NVMeDriveIndex": 0,
+ "NVMeDriveBusID": 47,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_0_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_0_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_0_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_0_locate",
+ "NVMeDrivePresentPin": 499,
+ "NVMeDrivePwrGoodPin": 467
+ },
+ {
+ "NVMeDriveIndex": 1,
+ "NVMeDriveBusID": 46,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_1_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_1_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_1_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_1_locate",
+ "NVMeDrivePresentPin": 498,
+ "NVMeDrivePwrGoodPin": 466
+ },
+ {
+ "NVMeDriveIndex": 2,
+ "NVMeDriveBusID": 45,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_2_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_2_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_2_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_2_locate",
+ "NVMeDrivePresentPin": 497,
+ "NVMeDrivePwrGoodPin": 465
+ },
+ {
+ "NVMeDriveIndex": 3,
+ "NVMeDriveBusID": 44,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_3_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_3_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_3_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_3_locate",
+ "NVMeDrivePresentPin": 496,
+ "NVMeDrivePwrGoodPin": 464
+ },
+ {
+ "NVMeDriveIndex": 4,
+ "NVMeDriveBusID": 39,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_4_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_4_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_4_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_4_locate",
+ "NVMeDrivePresentPin": 503,
+ "NVMeDrivePwrGoodPin": 471
+ },
+ {
+ "NVMeDriveIndex": 5,
+ "NVMeDriveBusID": 38,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_5_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_5_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_5_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_5_locate",
+ "NVMeDrivePresentPin": 502,
+ "NVMeDrivePwrGoodPin": 470
+ },
+ {
+ "NVMeDriveIndex": 6,
+ "NVMeDriveBusID": 37,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_6_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_6_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_6_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_6_locate",
+ "NVMeDrivePresentPin": 501,
+ "NVMeDrivePwrGoodPin": 469
+ },
+ {
+ "NVMeDriveIndex": 7,
+ "NVMeDriveBusID": 36,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_7_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_7_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_7_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_7_locate",
+ "NVMeDrivePresentPin": 500,
+ "NVMeDrivePwrGoodPin": 468
+ },
+ {
+ "NVMeDriveIndex": 8,
+ "NVMeDriveBusID": 31,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_8_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_8_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_8_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_8_locate",
+ "NVMeDrivePresentPin": 507,
+ "NVMeDrivePwrGoodPin": 475
+ },
+ {
+ "NVMeDriveIndex": 9,
+ "NVMeDriveBusID": 30,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_9_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_9_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_9_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_9_locate",
+ "NVMeDrivePresentPin": 506,
+ "NVMeDrivePwrGoodPin": 474
+ },
+ {
+ "NVMeDriveIndex": 10,
+ "NVMeDriveBusID": 29,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_10_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_10_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_10_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_10_locate",
+ "NVMeDrivePresentPin": 505,
+ "NVMeDrivePwrGoodPin": 473
+ },
+ {
+ "NVMeDriveIndex": 11,
+ "NVMeDriveBusID": 28,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_11_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_11_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_11_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_11_locate",
+ "NVMeDrivePresentPin": 504,
+ "NVMeDrivePwrGoodPin": 472
+ },
+ {
+ "NVMeDriveIndex": 12,
+ "NVMeDriveBusID": 27,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_12_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_12_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_12_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_12_locate",
+ "NVMeDrivePresentPin": 511,
+ "NVMeDrivePwrGoodPin": 479
+ },
+ {
+ "NVMeDriveIndex": 13,
+ "NVMeDriveBusID": 26,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_13_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_13_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_13_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_13_locate",
+ "NVMeDrivePresentPin": 510,
+ "NVMeDrivePwrGoodPin": 478
+ },
+ {
+ "NVMeDriveIndex": 14,
+ "NVMeDriveBusID": 25,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_14_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_14_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_14_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_14_locate",
+ "NVMeDrivePresentPin": 509,
+ "NVMeDrivePwrGoodPin": 477
+ },
+ {
+ "NVMeDriveIndex": 15,
+ "NVMeDriveBusID": 24,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_15_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_15_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_15_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_15_locate",
+ "NVMeDrivePresentPin": 508,
+ "NVMeDrivePwrGoodPin": 476
+ }
+ ],
+ "threshold": [
+ {
+ "criticalHigh": 77,
+ "criticalLow": 0,
+ "warningHigh": 77,
+ "warningLow": 0,
+ "maxValue": 127,
+ "minValue": -128
+ }
+ ]
+} \ No newline at end of file
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/nvme_json_rewrite.sh b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/nvme_json_rewrite.sh
new file mode 100644
index 000000000..91dcb5cb3
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/nvme_json_rewrite.sh
@@ -0,0 +1,214 @@
+#!/bin/bash
+
+TARGET_FILE_NAME="/etc/nvme/nvme_config.json"
+
+export_gpio() {
+ if [ ! -d "/sys/class/gpio/gpio$1" ]; then
+ echo $1 >/sys/class/gpio/export
+ fi
+}
+
+# Get NVMeDrivePresentPins
+# 1-0024
+
+# Get NVMeDrivePwrGoodPins
+# 1-0021
+
+if [ -d "/sys/bus/i2c/drivers/pca953x/1-0024" ]; then
+ presentPinBase="$(cat /sys/bus/i2c/drivers/pca953x/1-0024/gpio/gpiochip*/base)"
+ for i in {0..15};
+ do
+ let presentPinBase[$i]=presentPinBase+$i
+ export_gpio ${presentPinBase[$i]}
+ done
+else
+ echo "Can't find present gpio expander (addr: 0x24) !!"
+fi
+
+if [ -d "/sys/bus/i2c/drivers/pca953x/1-0021" ]; then
+ PwrGoodPinBase="$(cat /sys/bus/i2c/drivers/pca953x/1-0021/gpio/gpiochip*/base)"
+ for i in {0..15};
+ do
+ let PwrGoodPinBase[$i]=PwrGoodPinBase+$i
+ export_gpio ${PwrGoodPinBase[$i]}
+ done
+else
+ echo "Can't find powergood gpio expander (addr: 0x21) !!"
+fi
+
+cat > $TARGET_FILE_NAME << EOF1
+{
+ "config": [
+ {
+ "NVMeDriveIndex": 0,
+ "NVMeDriveBusID": 47,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_0_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_0_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_0_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_0_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[3]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[3]}
+ },
+ {
+ "NVMeDriveIndex": 1,
+ "NVMeDriveBusID": 46,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_1_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_1_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_1_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_1_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[2]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[2]}
+ },
+ {
+ "NVMeDriveIndex": 2,
+ "NVMeDriveBusID": 45,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_2_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_2_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_2_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_2_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[1]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[1]}
+ },
+ {
+ "NVMeDriveIndex": 3,
+ "NVMeDriveBusID": 44,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_3_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_3_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_3_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_3_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[0]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[0]}
+ },
+ {
+ "NVMeDriveIndex": 4,
+ "NVMeDriveBusID": 39,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_4_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_4_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_4_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_4_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[7]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[7]}
+ },
+ {
+ "NVMeDriveIndex": 5,
+ "NVMeDriveBusID": 38,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_5_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_5_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_5_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_5_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[6]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[6]}
+ },
+ {
+ "NVMeDriveIndex": 6,
+ "NVMeDriveBusID": 37,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_6_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_6_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_6_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_6_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[5]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[5]}
+ },
+ {
+ "NVMeDriveIndex": 7,
+ "NVMeDriveBusID": 36,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_7_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_7_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_7_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_7_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[4]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[4]}
+ },
+ {
+ "NVMeDriveIndex": 8,
+ "NVMeDriveBusID": 31,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_8_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_8_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_8_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_8_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[11]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[11]}
+ },
+ {
+ "NVMeDriveIndex": 9,
+ "NVMeDriveBusID": 30,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_9_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_9_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_9_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_9_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[10]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[10]}
+ },
+ {
+ "NVMeDriveIndex": 10,
+ "NVMeDriveBusID": 29,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_10_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_10_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_10_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_10_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[9]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[9]}
+ },
+ {
+ "NVMeDriveIndex": 11,
+ "NVMeDriveBusID": 28,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_11_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_11_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_11_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_11_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[8]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[8]}
+ },
+ {
+ "NVMeDriveIndex": 12,
+ "NVMeDriveBusID": 27,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_12_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_12_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_12_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_12_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[15]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[15]}
+ },
+ {
+ "NVMeDriveIndex": 13,
+ "NVMeDriveBusID": 26,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_13_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_13_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_13_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_13_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[14]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[14]}
+ },
+ {
+ "NVMeDriveIndex": 14,
+ "NVMeDriveBusID": 25,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_14_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_14_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_14_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_14_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[13]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[13]}
+ },
+ {
+ "NVMeDriveIndex": 15,
+ "NVMeDriveBusID": 24,
+ "NVMeDriveFaultLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_15_fault",
+ "NVMeDriveLocateLEDGroupPath": "/xyz/openbmc_project/led/groups/led_u2_15_locate",
+ "NVMeDriveLocateLEDControllerBusName": "xyz.openbmc_project.LED.Controller.led_u2_15_locate",
+ "NVMeDriveLocateLEDControllerPath": "/xyz/openbmc_project/led/physical/led_u2_15_locate",
+ "NVMeDrivePresentPin": ${presentPinBase[12]},
+ "NVMeDrivePwrGoodPin": ${PwrGoodPinBase[12]}
+ }
+ ],
+ "threshold": [
+ {
+ "criticalHigh": 77,
+ "criticalLow": 0,
+ "warningHigh": 77,
+ "warningLow": 0,
+ "maxValue": 127,
+ "minValue": -128
+ }
+ ]
+}
+EOF1
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/xyz.openbmc_project.nvme.manager.service.replace b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/xyz.openbmc_project.nvme.manager.service.replace
new file mode 100644
index 000000000..1238b4df3
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme/xyz.openbmc_project.nvme.manager.service.replace
@@ -0,0 +1,19 @@
+[Unit]
+Description=NVMe management
+Wants=xyz.openbmc_project.LED.GroupManager.service xyz.openbmc_project.Inventory.Manager.service
+After=xyz.openbmc_project.LED.GroupManager.service xyz.openbmc_project.Inventory.Manager.service
+Wants=mapper-wait@-xyz-openbmc_project-control-nvme.service
+After=mapper-wait@-xyz-openbmc_project-control-nvme.service
+
+[Service]
+ExecStartPre=/usr/bin/nvme_json_rewrite.sh
+ExecStart=/usr/bin/nvme_main
+Type=dbus
+BusName=xyz.openbmc_project.nvme.manager
+SyslogIdentifier=phosphor-nvme
+Restart=always
+RestartSec=3
+StartLimitInterval=0
+
+[Install]
+WantedBy=multi-user.target \ No newline at end of file
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme_%.bbappend
new file mode 100644
index 000000000..c3db11dad
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/sensors/phosphor-nvme_%.bbappend
@@ -0,0 +1,17 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+SRC_URI_append_gbs = " file://nvme_config.json"
+SRC_URI_append_gbs = " file://nvme_json_rewrite.sh"
+SRC_URI_append_gbs = " file://xyz.openbmc_project.nvme.manager.service.replace"
+
+RDEPENDS_${PN} += "bash"
+
+do_install_append_gbs() {
+ install -d ${D}/${sysconfdir}/nvme/
+ install -m 0644 ${WORKDIR}/nvme_config.json ${D}/${sysconfdir}/nvme/
+
+ install -d ${D}${bindir}
+ install -m 0755 ${WORKDIR}/nvme_json_rewrite.sh ${D}${bindir}/
+
+ install -d ${D}${systemd_system_unitdir}
+ install -m 0644 ${WORKDIR}/xyz.openbmc_project.nvme.manager.service.replace ${D}${systemd_system_unitdir}/xyz.openbmc_project.nvme.manager.service
+}
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager/restrictionmode-default-whitelist.override.yml b/meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager/restrictionmode-default-whitelist.override.yml
new file mode 100644
index 000000000..b0de5dd1a
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager/restrictionmode-default-whitelist.override.yml
@@ -0,0 +1,6 @@
+---
+/xyz/openbmc_project/control/host0/restriction_mode:
+ - Interface: xyz.openbmc_project.Control.Security.RestrictionMode
+ Properties:
+ RestrictionMode:
+ Default: RestrictionMode::Modes::Whitelist
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager/time-default.override.yml b/meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager/time-default.override.yml
new file mode 100644
index 000000000..0096eeb5c
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager/time-default.override.yml
@@ -0,0 +1,6 @@
+---
+/xyz/openbmc_project/time/sync_method:
+ - Interface: xyz.openbmc_project.Time.Synchronization
+ Properties:
+ TimeSyncMethod:
+ Default: Synchronization::Method::Manual
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager_%.bbappend
new file mode 100644
index 000000000..7e2056844
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/settings/phosphor-settings-manager_%.bbappend
@@ -0,0 +1,3 @@
+FILESEXTRAPATHS_append_gbs := ":${THISDIR}/${PN}"
+SRC_URI_append_gbs = " file://time-default.override.yml"
+SRC_URI_append_gbs = " file://restrictionmode-default-whitelist.override.yml"
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/0001-Customize-phosphor-watchdog-for-Intel-platforms.patch b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/0001-Customize-phosphor-watchdog-for-Intel-platforms.patch
new file mode 100644
index 000000000..22670d3fc
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/0001-Customize-phosphor-watchdog-for-Intel-platforms.patch
@@ -0,0 +1,313 @@
+From ac0c216ac2c273c620579fd1308c8c225e0cca36 Mon Sep 17 00:00:00 2001
+From: James Feist <james.feist@linux.intel.com>
+Date: Mon, 17 Jun 2019 12:00:58 -0700
+Subject: [PATCH] Customize phosphor-watchdog for Intel platforms
+
+This patch adds various changes to phosphor-watchdog that are
+required for compatibility with Intel platforms.
+
+ 1. Add Redfish messages for watchdog timeout and pre-interrupt
+ 2. Use dbus properties for power control insted of service files
+ 3. Use host status to enable/disable watchdog
+ 4. Set preTimeoutInterruptOccurFlag
+
+Signed-off-by: James Feist <james.feist@linux.intel.com>
+Signed-off-by: Ren Yu <yux.ren@intel.com>
+Signed-off-by: Yong Li <yong.b.li@linux.intel.com>
+Signed-off-by: Jason M. Bills <jason.m.bills@linux.intel.com>
+---
+ watchdog.cpp | 193 ++++++++++++++++++++++++++++++++++++++++++++++++---
+ watchdog.hpp | 23 +++++-
+ 2 files changed, 206 insertions(+), 10 deletions(-)
+
+diff --git a/watchdog.cpp b/watchdog.cpp
+index 57e9050..3b5356f 100644
+--- a/watchdog.cpp
++++ b/watchdog.cpp
+@@ -1,11 +1,14 @@
+ #include "watchdog.hpp"
+
++#include <systemd/sd-journal.h>
++
+ #include <algorithm>
+ #include <chrono>
+ #include <phosphor-logging/elog.hpp>
+ #include <phosphor-logging/log.hpp>
+ #include <sdbusplus/exception.hpp>
+ #include <xyz/openbmc_project/Common/error.hpp>
++#include <xyz/openbmc_project/State/Host/server.hpp>
+
+ namespace phosphor
+ {
+@@ -18,10 +21,69 @@ using namespace phosphor::logging;
+ using sdbusplus::exception::SdBusError;
+ using sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
+
+-// systemd service to kick start a target.
+-constexpr auto SYSTEMD_SERVICE = "org.freedesktop.systemd1";
+-constexpr auto SYSTEMD_ROOT = "/org/freedesktop/systemd1";
+-constexpr auto SYSTEMD_INTERFACE = "org.freedesktop.systemd1.Manager";
++const static constexpr char* currentHostState = "CurrentHostState";
++const static constexpr char* hostStatusOff =
++ "xyz.openbmc_project.State.Host.HostState.Off";
++
++const static constexpr char* actionDescription = " due to Watchdog timeout";
++const static constexpr char* hardResetDescription = "Hard Reset - System reset";
++const static constexpr char* powerOffDescription =
++ "Power Down - System power down";
++const static constexpr char* powerCycleDescription =
++ "Power Cycle - System power cycle";
++const static constexpr char* timerExpiredDescription = "Timer expired";
++
++const static constexpr char* preInterruptActionNone =
++ "xyz.openbmc_project.State.Watchdog.PreTimeoutInterruptAction.None";
++
++const static constexpr char* preInterruptDescriptionSMI = "SMI";
++const static constexpr char* preInterruptDescriptionNMI = "NMI";
++const static constexpr char* preInterruptDescriptionMI = "Messaging Interrupt";
++
++const static constexpr char* reservedDescription = "Reserved";
++
++const static constexpr char* timerUseDescriptionBIOSFRB2 = "BIOS FRB2";
++const static constexpr char* timerUseDescriptionBIOSPOST = "BIOS/POST";
++const static constexpr char* timerUseDescriptionOSLoad = "OSLoad";
++const static constexpr char* timerUseDescriptionSMSOS = "SMS/OS";
++const static constexpr char* timerUseDescriptionOEM = "OEM";
++
++namespace restart
++{
++static constexpr const char* busName =
++ "xyz.openbmc_project.Control.Host.RestartCause";
++static constexpr const char* path =
++ "/xyz/openbmc_project/control/host0/restart_cause";
++static constexpr const char* interface =
++ "xyz.openbmc_project.Control.Host.RestartCause";
++static constexpr const char* property = "RequestedRestartCause";
++} // namespace restart
++
++// chassis state manager service
++namespace chassis
++{
++static constexpr const char* busName = "xyz.openbmc_project.State.Chassis";
++static constexpr const char* path = "/xyz/openbmc_project/state/chassis0";
++static constexpr const char* interface = "xyz.openbmc_project.State.Chassis";
++static constexpr const char* request = "RequestedPowerTransition";
++} // namespace chassis
++
++void Watchdog::powerStateChangedHandler(
++ const std::map<std::string, std::variant<std::string>>& props)
++{
++ const auto iter = props.find(currentHostState);
++ if (iter != props.end())
++ {
++ const std::string* powerState = std::get_if<std::string>(&iter->second);
++ if (powerState && (*powerState == hostStatusOff))
++ {
++ if (timerEnabled())
++ {
++ enabled(false);
++ }
++ }
++ }
++}
+
+ void Watchdog::resetTimeRemaining(bool enableWatchdog)
+ {
+@@ -107,13 +169,102 @@ uint64_t Watchdog::interval(uint64_t value)
+ // Optional callback function on timer expiration
+ void Watchdog::timeOutHandler()
+ {
++ PreTimeoutInterruptAction preTimeoutInterruptAction = preTimeoutInterrupt();
++ std::string preInterruptActionMessageArgs{};
++
+ Action action = expireAction();
++ std::string actionMessageArgs{};
++
++ expiredTimerUse(currentTimerUse());
++
++ TimerUse timeUser = expiredTimerUse();
++ std::string timeUserMessage{};
++
+ if (!this->enabled())
+ {
+ action = fallback->action;
+ }
+
+- expiredTimerUse(currentTimerUse());
++ switch (timeUser)
++ {
++ case Watchdog::TimerUse::BIOSFRB2:
++ timeUserMessage = timerUseDescriptionBIOSFRB2;
++ break;
++ case Watchdog::TimerUse::BIOSPOST:
++ timeUserMessage = timerUseDescriptionBIOSPOST;
++ break;
++ case Watchdog::TimerUse::OSLoad:
++ timeUserMessage = timerUseDescriptionOSLoad;
++ break;
++ case Watchdog::TimerUse::SMSOS:
++ timeUserMessage = timerUseDescriptionSMSOS;
++ break;
++ case Watchdog::TimerUse::OEM:
++ timeUserMessage = timerUseDescriptionOEM;
++ break;
++ default:
++ timeUserMessage = reservedDescription;
++ break;
++ }
++
++ switch (action)
++ {
++ case Watchdog::Action::HardReset:
++ actionMessageArgs = std::string(hardResetDescription) +
++ std::string(actionDescription);
++ break;
++ case Watchdog::Action::PowerOff:
++ actionMessageArgs = std::string(powerOffDescription) +
++ std::string(actionDescription);
++ break;
++ case Watchdog::Action::PowerCycle:
++ actionMessageArgs = std::string(powerCycleDescription) +
++ std::string(actionDescription);
++ break;
++ case Watchdog::Action::None:
++ actionMessageArgs = timerExpiredDescription;
++ break;
++ default:
++ actionMessageArgs = reservedDescription;
++ break;
++ }
++
++ // Log into redfish event log
++ sd_journal_send("MESSAGE=IPMIWatchdog: Timed out ACTION=%s",
++ convertForMessage(action).c_str(), "PRIORITY=%i", LOG_INFO,
++ "REDFISH_MESSAGE_ID=%s", "OpenBMC.0.1.IPMIWatchdog",
++ "REDFISH_MESSAGE_ARGS=%s. timer use: %s",
++ actionMessageArgs.c_str(), timeUserMessage.c_str(), NULL);
++
++ switch (preTimeoutInterruptAction)
++ {
++ case Watchdog::PreTimeoutInterruptAction::SMI:
++ preInterruptActionMessageArgs = preInterruptDescriptionSMI;
++ break;
++ case Watchdog::PreTimeoutInterruptAction::NMI:
++ preInterruptActionMessageArgs = preInterruptDescriptionNMI;
++ break;
++ case Watchdog::PreTimeoutInterruptAction::MI:
++ preInterruptActionMessageArgs = preInterruptDescriptionMI;
++ break;
++ default:
++ preInterruptActionMessageArgs = reservedDescription;
++ break;
++ }
++
++ if (preInterruptActionNone != convertForMessage(preTimeoutInterruptAction))
++ {
++ preTimeoutInterruptOccurFlag(true);
++
++ sd_journal_send("MESSAGE=IPMIWatchdog: Pre Timed out Interrupt=%s",
++ convertForMessage(preTimeoutInterruptAction).c_str(),
++ "PRIORITY=%i", LOG_INFO, "REDFISH_MESSAGE_ID=%s",
++ "OpenBMC.0.1.IPMIWatchdog",
++ "REDFISH_MESSAGE_ARGS=Timer interrupt - %s due to "
++ "Watchdog timeout. timer use: %s",
++ preInterruptActionMessageArgs.c_str(),
++ timeUserMessage.c_str(), NULL);
++ }
+
+ auto target = actionTargetMap.find(action);
+ if (target == actionTargetMap.end())
+@@ -133,10 +284,11 @@ void Watchdog::timeOutHandler()
+
+ try
+ {
+- auto method = bus.new_method_call(SYSTEMD_SERVICE, SYSTEMD_ROOT,
+- SYSTEMD_INTERFACE, "StartUnit");
+- method.append(target->second);
+- method.append("replace");
++ auto method =
++ bus.new_method_call(chassis::busName, chassis::path,
++ "org.freedesktop.DBus.Properties", "Set");
++ method.append(chassis::interface, chassis::request,
++ std::variant<std::string>(target->second));
+
+ bus.call_noreply(method);
+ }
+@@ -147,6 +299,29 @@ void Watchdog::timeOutHandler()
+ entry("ERROR=%s", e.what()));
+ commit<InternalFailure>();
+ }
++
++ // set restart cause for watchdog HardReset & PowerCycle actions
++ if ((action == Watchdog::Action::HardReset) ||
++ (action == Watchdog::Action::PowerCycle))
++ {
++ try
++ {
++ auto method = bus.new_method_call(
++ restart::busName, restart::path,
++ "org.freedesktop.DBus.Properties", "Set");
++ method.append(
++ restart::interface, restart::property,
++ std::variant<std::string>("xyz.openbmc_project.State.Host."
++ "RestartCause.WatchdogTimer"));
++ bus.call(method);
++ }
++ catch (sdbusplus::exception_t& e)
++ {
++ log<level::ERR>("Failed to set HostRestartCause property",
++ entry("ERROR=%s", e.what()));
++ commit<InternalFailure>();
++ }
++ }
+ }
+
+ tryFallbackOrDisable();
+diff --git a/watchdog.hpp b/watchdog.hpp
+index 7de9bb3..b004b7a 100644
+--- a/watchdog.hpp
++++ b/watchdog.hpp
+@@ -68,7 +68,18 @@ class Watchdog : public WatchdogInherits
+ WatchdogInherits(bus, objPath),
+ bus(bus), actionTargetMap(std::move(actionTargetMap)),
+ fallback(std::move(fallback)), minInterval(minInterval),
+- timer(event, std::bind(&Watchdog::timeOutHandler, this))
++ timer(event, std::bind(&Watchdog::timeOutHandler, this)),
++ powerStateChangedSignal(
++ bus,
++ sdbusplus::bus::match::rules::propertiesChanged(
++ "/xyz/openbmc_project/state/host0",
++ "xyz.openbmc_project.State.Host"),
++ [this](sdbusplus::message::message& msg) {
++ std::string objectName;
++ std::map<std::string, std::variant<std::string>> props;
++ msg.read(objectName, props);
++ powerStateChangedHandler(props);
++ })
+ {
+ // We set the watchdog interval with the default value.
+ interval(interval());
+@@ -77,6 +88,12 @@ class Watchdog : public WatchdogInherits
+ tryFallbackOrDisable();
+ }
+
++ /** @brief Disable watchdog when power status change meet
++ * the specific requirement
++ */
++ void powerStateChangedHandler(
++ const std::map<std::string, std::variant<std::string>>& props);
++
+ /** @brief Resets the TimeRemaining to the configured Interval
+ * Optionally enables the watchdog.
+ *
+@@ -165,6 +182,10 @@ class Watchdog : public WatchdogInherits
+ /** @brief Contained timer object */
+ sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> timer;
+
++ /** @brief Optional Callback handler when power status change meet
++ * the specific requirement */
++ sdbusplus::bus::match_t powerStateChangedSignal;
++
+ /** @brief Optional Callback handler on timer expirartion */
+ void timeOutHandler();
+
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-watchdog.service b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-watchdog.service
new file mode 100644
index 000000000..5ef1a4179
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog/phosphor-watchdog.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Phosphor Watchdog
+
+[Service]
+ExecStart=/usr/bin/env phosphor-watchdog --continue --service=xyz.openbmc_project.Watchdog \
+ --path=/xyz/openbmc_project/watchdog/host0 \
+ --action_target=xyz.openbmc_project.State.Watchdog.Action.HardReset=xyz.openbmc_project.State.Chassis.Transition.Reset \
+ --action_target=xyz.openbmc_project.State.Watchdog.Action.PowerOff=xyz.openbmc_project.State.Chassis.Transition.Off \
+ --action_target=xyz.openbmc_project.State.Watchdog.Action.PowerCycle=xyz.openbmc_project.State.Chassis.Transition.PowerCycle
+
+SyslogIdentifier=phosphor-watchdog
+BusName =xyz.openbmc_project.Watchdog
+Type=dbus
+
+[Install]
+WantedBy=basic.target
diff --git a/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog_%.bbappend b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog_%.bbappend
new file mode 100644
index 000000000..9c491ecfc
--- /dev/null
+++ b/meta-quanta/meta-gbs/recipes-phosphor/watchdog/phosphor-watchdog_%.bbappend
@@ -0,0 +1,7 @@
+FILESEXTRAPATHS_prepend_gbs := "${THISDIR}/${PN}:"
+
+SRC_URI_append_gbs = " file://0001-Customize-phosphor-watchdog-for-Intel-platforms.patch"
+
+# Remove the override to keep service running after DC cycle
+SYSTEMD_OVERRIDE_${PN}_remove_gbs = "poweron.conf:phosphor-watchdog@poweron.service.d/poweron.conf"
+SYSTEMD_SERVICE_${PN}_gbs = "phosphor-watchdog.service"