summaryrefslogtreecommitdiffstats
path: root/meta-openbmc-machines/meta-openpower/meta-rcs
diff options
context:
space:
mode:
authorRaptor Engineering Development Team <support@raptorengineering.com>2018-01-14 05:14:38 -0600
committerRaptor Engineering Development Team <support@raptorengineering.com>2018-01-17 17:14:22 -0600
commita4e8e4f62c7d781e3ee774e887b3c14b561661d0 (patch)
tree413c742d4075a71eabeb0f85866758a2d7070c50 /meta-openbmc-machines/meta-openpower/meta-rcs
parent80676c3d0ae5af74d112b9a03e6857459b252178 (diff)
downloadtalos-openbmc-a4e8e4f62c7d781e3ee774e887b3c14b561661d0.tar.gz
talos-openbmc-a4e8e4f62c7d781e3ee774e887b3c14b561661d0.zip
Initial port of Witherspoon fan control to Talos
NOTE: Not yet tested on hardware Mapping likely incorrect
Diffstat (limited to 'meta-openbmc-machines/meta-openpower/meta-rcs')
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/conf/machine/talos.conf19
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-kernel/linux/linux-obmc/talos.cfg6
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%.bbappend33
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-conflicts.conf2
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-monitor.conf5
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/obmc/phosphor-fan/phosphor-cooling-type-0.conf6
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/phosphor-cooling-type@.service13
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend1
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml825
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config%.bbappend1
-rwxr-xr-xmeta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config%/fans.yaml31
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native.bbappend1
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native/zone_conditions.yaml18
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native.bbappend2
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml56
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-monitor-config-native.bbappend1
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-monitor-config-native/monitor.yaml58
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-presence-config-native%.bbappend1
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-presence-config-native%/config.yaml53
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy-native.bb16
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/air-cooled.yaml241
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/fan-errors.yaml894
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/water-cooled.yaml233
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog.bb22
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/obmc/talos-fan-watchdog/fan-watchdog.conf3
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/obmc/talos-fan-watchdog/reset-fan-watchdog.conf4
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-fan-watchdog-monitor@.service10
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-fan-watchdog.service13
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-reset-fan-watchdog.service12
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-thermal-policy-native.bb12
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-thermal-policy/thermal-policy.yaml200
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/ipmi/phosphor-ipmi-fru-read-bmc-inventory%/bmc-fru-config.yaml36
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bbappend2
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%.bbappend21
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon-max31785/talos.conf3
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/max31785@52.conf13
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/power-supply@68.conf23
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/power-supply@69.conf23
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/pwm-tacho-controller@1e786000.conf1
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/70-hwmon.rules1
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/70-iio.rules1
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/phosphor-max31785-msl@.service11
-rw-r--r--meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/xyz.openbmc_project.Hwmon@.service11
43 files changed, 2931 insertions, 7 deletions
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/conf/machine/talos.conf b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/conf/machine/talos.conf
index 6f689df85..0f2e6634a 100644
--- a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/conf/machine/talos.conf
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/conf/machine/talos.conf
@@ -3,6 +3,10 @@ KERNEL_DEVICETREE = "${KMACHINE}-bmc-opp-${MACHINE}.dtb"
UBOOT_MACHINE = "ast_g5_ncsi_config"
+OBMC_MACHINE_FEATURES += "obmc-mrw"
+
+OBMC_POWER_SUPPLY_INSTANCES = "0 1"
+
PREFERRED_PROVIDER_virtual/p9-vcs-workaround = 'fpga-trigger'
require conf/machine/include/ast2500.inc
@@ -10,8 +14,19 @@ require conf/machine/include/obmc-bsp-common.inc
require conf/machine/include/rcs.inc
require conf/machine/include/p9.inc
-PHOSPHOR_MRW_URI = "https://git.raptorcs.com/talos-openpower/talos-xml"
-PHOSPHOR_MRW_REV = "14b471fbf37f5fb60261de001df83caf5f96d81f"
+PHOSPHOR_MRW_URI = "git://scm.raptorcs.com/scm/git/talos-xml;protocol=https"
+PHOSPHOR_MRW_REV = "572148010e4bf8dbf9c3578bd5c1ca17d13cee73"
+
+# Inhibit phosphor-hwmon-config-mrw
+VIRTUAL-RUNTIME_phosphor-hwmon-config = ""
+
+# Inhibit phosphor-fan-presence-mrw-native
+PREFERRED_PROVIDER_virtual/phosphor-fan-presence-config = \
+ "phosphor-fan-presence-config-native"
+
+# Inhibit phosphor-fan-control-fan-config-mrw-native
+PREFERRED_PROVIDER_virtual/phosphor-fan-control-fan-config = \
+ "phosphor-fan-control-fan-config-native"
DISTRO_FEATURES_append = "\
obmc-openpower \
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-kernel/linux/linux-obmc/talos.cfg b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-kernel/linux/linux-obmc/talos.cfg
index 2a20c7eaf..41b213f18 100644
--- a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-kernel/linux/linux-obmc/talos.cfg
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-kernel/linux/linux-obmc/talos.cfg
@@ -2,3 +2,9 @@ CONFIG_HWMON=y
CONFIG_SENSORS_TMP421=y
CONFIG_SENSORS_MAX31785=y
CONFIG_RTC_DRV_RV8803=y
+
+CONFIG_DEBUG_LL=y
+CONFIG_DEBUG_LL_UART_8250=y
+CONFIG_DEBUG_UART_PHYS=0x1e784000
+CONFIG_DEBUG_UART_VIRT=0xe8784000
+CONFIG_EARLY_PRINTK=y
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%.bbappend b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%.bbappend
new file mode 100644
index 000000000..76aad1558
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%.bbappend
@@ -0,0 +1,33 @@
+FILESEXTRAPATHS_append := "${THISDIR}/${PN}:"
+
+# Package configuration
+FAN_PACKAGES += " \
+ phosphor-cooling-type \
+"
+
+PACKAGECONFIG += "cooling-type"
+
+RDEPENDS_phosphor-cooling-type += "libevdev"
+
+TMPL_COOLING = "phosphor-cooling-type@.service"
+INSTFMT_COOLING = "phosphor-cooling-type@{0}.service"
+COOLING_TGT = "${SYSTEMD_DEFAULT_TARGET}"
+FMT_COOLING = "../${TMPL_COOLING}:${COOLING_TGT}.requires/${INSTFMT_COOLING}"
+
+FILES_phosphor-cooling-type = "${sbindir}/phosphor-cooling-type"
+SYSTEMD_SERVICE_phosphor-cooling-type += "${TMPL_COOLING}"
+SYSTEMD_LINK_phosphor-cooling-type += "${@compose_list(d, 'FMT_COOLING', 'OBMC_CHASSIS_INSTANCES')}"
+
+COOLING_ENV_FMT = "obmc/phosphor-fan/phosphor-cooling-type-{0}.conf"
+
+SYSTEMD_ENVIRONMENT_FILE_phosphor-cooling-type += "${@compose_list(d, 'COOLING_ENV_FMT', 'OBMC_CHASSIS_INSTANCES')}"
+
+#These services are protected by the watchdog
+SYSTEMD_OVERRIDE_phosphor-fan-control-init += "fan-watchdog-monitor.conf:phosphor-fan-control-init@0.service.d/fan-watchdog-monitor.conf"
+SYSTEMD_OVERRIDE_phosphor-fan-control += "fan-watchdog-monitor.conf:phosphor-fan-control@0.service.d/fan-watchdog-monitor.conf"
+SYSTEMD_OVERRIDE_phosphor-fan-monitor-init += "fan-watchdog-monitor.conf:phosphor-fan-monitor-init@0.service.d/fan-watchdog-monitor.conf"
+SYSTEMD_OVERRIDE_phosphor-fan-monitor += "fan-watchdog-monitor.conf:phosphor-fan-monitor@0.service.d/fan-watchdog-monitor.conf"
+
+#These services need to be stopped when watchdog expires
+SYSTEMD_OVERRIDE_phosphor-fan-control += "fan-watchdog-conflicts.conf:phosphor-fan-control@0.service.d/fan-watchdog-conflicts.conf"
+SYSTEMD_OVERRIDE_phosphor-fan-monitor += "fan-watchdog-conflicts.conf:phosphor-fan-monitor@0.service.d/fan-watchdog-conflicts.conf"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-conflicts.conf b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-conflicts.conf
new file mode 100644
index 000000000..90b1e810e
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-conflicts.conf
@@ -0,0 +1,2 @@
+[Unit]
+Conflicts=obmc-fan-watchdog-takeover.target
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-monitor.conf b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-monitor.conf
new file mode 100644
index 000000000..240336343
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-monitor.conf
@@ -0,0 +1,5 @@
+[Unit]
+#These overrides allow the fan watchdog to take over when this service dies
+OnFailure=talos-fan-watchdog-monitor@%n.service
+StartLimitIntervalSec=5
+StartLimitBurst=3
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/obmc/phosphor-fan/phosphor-cooling-type-0.conf b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/obmc/phosphor-fan/phosphor-cooling-type-0.conf
new file mode 100644
index 000000000..6b74301d1
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/obmc/phosphor-fan/phosphor-cooling-type-0.conf
@@ -0,0 +1,6 @@
+OBJPATH="--path=/system/chassis"
+AIR="--air"
+WATER=""
+DEVICE=""
+CODE=""
+
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/phosphor-cooling-type@.service b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/phosphor-cooling-type@.service
new file mode 100644
index 000000000..9a4f8df42
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan%/phosphor-cooling-type@.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Phosphor Cooling Type
+Wants=mapper-wait@-xyz-openbmc_project-inventory.service
+After=mapper-wait@-xyz-openbmc_project-inventory.service
+ConditionPathExists={envfiledir}/obmc/phosphor-fan/phosphor-cooling-type-%i.conf
+
+[Service]
+EnvironmentFile={envfiledir}/obmc/phosphor-fan/phosphor-cooling-type-%i.conf
+ExecStart=/usr/bin/env phosphor-cooling-type ${{OBJPATH}} ${{AIR}} ${{WATER}} ${{DEVICE}} ${{CODE}}
+SyslogIdentifier=phosphor-cooling-type
+
+[Install]
+RequiredBy={SYSTEMD_DEFAULT_TARGET}
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend
new file mode 100644
index 000000000..72d991c7e
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml
new file mode 100644
index 000000000..44fb52f22
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml
@@ -0,0 +1,825 @@
+groups:
+ - name: air_cooled_zone0_fans
+ description: Group of fan inventory objects for air cooled zone 0
+ type: /xyz/openbmc_project/inventory
+ members:
+ - /system/chassis/motherboard/fan4
+ - name: water_and_air_cooled_zone0_fans
+ description: Group of fan inventory objects for water/air cooled zone 0
+ type: /xyz/openbmc_project/inventory
+ members:
+ - /system/chassis/motherboard/fan4
+ - name: air_cooled_zone1_fans
+ description: Group of fan inventory objects for air cooled zone 1
+ type: /xyz/openbmc_project/inventory
+ members:
+ - /system/chassis/motherboard/fan5
+ - name: air_cooled_zone2_fans
+ description: Group of fan inventory objects for air cooled zone 2
+ type: /xyz/openbmc_project/inventory
+ members:
+ - /system/chassis/motherboard/fan0
+ - /system/chassis/motherboard/fan1
+ - /system/chassis/motherboard/fan2
+ - /system/chassis/motherboard/fan3
+ - name: water_and_air_cooled_zone2_fans
+ description: Group of fan inventory objects for water/air cooled zone 2
+ type: /xyz/openbmc_project/inventory
+ members:
+ - /system/chassis/motherboard/fan0
+ - name: zone2_ambient
+ description: Group of ambient temperature sensors for zone 2
+ type: /xyz/openbmc_project/sensors
+ members:
+ - /temperature/ambient
+ - name: occ0_object
+ description: Dbus object containing OCC0 properties
+ type: /org/open_power/control
+ members:
+ - /occ0
+ - name: occ1_object
+ description: Dbus object containing OCC1 properties
+ type: /org/open_power/control
+ members:
+ - /occ1
+ - name: zone0_cores
+ description: Group of core temperature sensors for zone 0
+ type: /xyz/openbmc_project/sensors
+ members:
+ - /temperature/p0_core0_temp
+ - /temperature/p0_core1_temp
+ - /temperature/p0_core2_temp
+ - /temperature/p0_core3_temp
+ - /temperature/p0_core4_temp
+ - /temperature/p0_core5_temp
+ - /temperature/p0_core6_temp
+ - /temperature/p0_core7_temp
+ - /temperature/p0_core8_temp
+ - /temperature/p0_core9_temp
+ - /temperature/p0_core10_temp
+ - /temperature/p0_core11_temp
+ - /temperature/p0_core12_temp
+ - /temperature/p0_core13_temp
+ - /temperature/p0_core14_temp
+ - /temperature/p0_core15_temp
+ - /temperature/p0_core16_temp
+ - /temperature/p0_core17_temp
+ - /temperature/p0_core18_temp
+ - /temperature/p0_core19_temp
+ - /temperature/p0_core20_temp
+ - /temperature/p0_core21_temp
+ - /temperature/p0_core22_temp
+ - /temperature/p0_core23_temp
+ - name: zone1_cores
+ description: Group of core temperature sensors for zone 1
+ type: /xyz/openbmc_project/sensors
+ members:
+ - /temperature/p1_core0_temp
+ - /temperature/p1_core1_temp
+ - /temperature/p1_core2_temp
+ - /temperature/p1_core3_temp
+ - /temperature/p1_core4_temp
+ - /temperature/p1_core5_temp
+ - /temperature/p1_core6_temp
+ - /temperature/p1_core7_temp
+ - /temperature/p1_core8_temp
+ - /temperature/p1_core9_temp
+ - /temperature/p1_core10_temp
+ - /temperature/p1_core11_temp
+ - /temperature/p1_core12_temp
+ - /temperature/p1_core13_temp
+ - /temperature/p1_core14_temp
+ - /temperature/p1_core15_temp
+ - /temperature/p1_core16_temp
+ - /temperature/p1_core17_temp
+ - /temperature/p1_core18_temp
+ - /temperature/p1_core19_temp
+ - /temperature/p1_core20_temp
+ - /temperature/p1_core21_temp
+ - /temperature/p1_core22_temp
+ - /temperature/p1_core23_temp
+ - name: zone0_regulators
+ description: Group of regulator temperature sensors for zone 0
+ type: /xyz/openbmc_project/sensors
+ members:
+ - /temperature/p0_vdd_temp
+ - name: zone1_regulators
+ description: Group of regulator temperature sensors for zone 1
+ type: /xyz/openbmc_project/sensors
+ members:
+ - /temperature/p1_vdd_temp
+ - name: zone0_dimms
+ description: Group of dimm temperature sensors for zone 0
+ type: /xyz/openbmc_project/sensors
+ members:
+ - /temperature/dimm0_temp
+ - /temperature/dimm1_temp
+ - /temperature/dimm2_temp
+ - /temperature/dimm3_temp
+ - /temperature/dimm4_temp
+ - /temperature/dimm5_temp
+ - /temperature/dimm6_temp
+ - /temperature/dimm7_temp
+ - name: zone1_dimms
+ description: Group of dimm temperature sensors for zone 1
+ type: /xyz/openbmc_project/sensors
+ members:
+ - /temperature/dimm8_temp
+ - /temperature/dimm9_temp
+ - /temperature/dimm10_temp
+ - /temperature/dimm11_temp
+ - /temperature/dimm12_temp
+ - /temperature/dimm13_temp
+ - /temperature/dimm14_temp
+ - /temperature/dimm15_temp
+ - name: zone0_gpu_cores
+ description: Group of gpu core temperature sensors for zone 0
+ type: /xyz/openbmc_project/sensors
+ members:
+ - /temperature/gpu0_core_temp
+ - /temperature/gpu1_core_temp
+ - /temperature/gpu2_core_temp
+ - /temperature/gpu3_core_temp
+ - /temperature/gpu4_core_temp
+ - /temperature/gpu5_core_temp
+ - name: zone0_gpu_memory
+ description: Group of gpu memory temperature sensors for zone 0
+ type: /xyz/openbmc_project/sensors
+ members:
+ - /temperature/gpu0_mem_temp
+ - /temperature/gpu1_mem_temp
+ - /temperature/gpu2_mem_temp
+ - /temperature/gpu3_mem_temp
+ - /temperature/gpu4_mem_temp
+ - /temperature/gpu5_mem_temp
+ - name: zone0_pcie
+ description: Group of pcie temperature sensors for zone 0
+ type: /xyz/openbmc_project/sensors
+ members:
+ - /temperature/pcie
+
+matches:
+ - name: propertiesChanged
+ description: >
+ A property changed match
+ parameters:
+ - object
+ - interface
+ signal: propertySignal
+ - name: interfacesAdded
+ description: >
+ An interfaces added match
+ parameters:
+ - object
+ signal: objectSignal
+ - name: interfacesRemoved
+ description: >
+ An interfaces removed match
+ parameters:
+ - object
+ signal: objectSignal
+ - name: nameOwnerChanged
+ description: >
+ A name owner changed match
+ parameters:
+ - object
+ - interface
+ signal: ownerSignal
+
+signals:
+ - name: propertySignal
+ description: >
+ Handle property signals
+ parameters:
+ - type
+ - object
+ - interface
+ - property
+ handler: setProperty
+ - name: objectSignal
+ description: >
+ Handle object signals
+ parameters:
+ - type
+ - object
+ - interface
+ - property
+ handler: setProperty
+ - name: ownerSignal
+ description: >
+ Handle owner signals
+ parameters:
+ - object
+ - interface
+ handler: setService
+
+handlers:
+ - name: setProperty
+ description: >
+ Sets a value for the given object/interface/property
+ parameters:
+ - type
+ - object
+ - interface
+ - property
+ - name: setService
+ description: >
+ Sets the service name(s) for the given group
+ parameters:
+ - group
+
+preconditions:
+ - name: property_states_match
+ description: >
+ All defined properties must match the values given to
+ enable a set speed event otherwise fan speeds are set to full
+ parameters:
+ - groups
+
+actions:
+ - name: call_actions_based_on_timer
+ description: >
+ Sets up a list of actions to be invoked when the defined timer
+ expires (or for each expiration of a repeating timer)
+ parameters:
+ - timer
+ - actions
+ - name: default_floor_on_missing_owner
+ description: >
+ Set the fan floor to the default floor
+ - name: set_speed_on_missing_owner
+ description: >
+ Set fans to the given speed when any service within the group
+ no longer exists
+ parameters:
+ - speed
+ - name: set_request_speed_base_with_max
+ description: >
+ Set the base request speed of a zone to the max value of a group for
+ calculating a new target speed
+ - name: count_state_before_speed
+ description: Set the speed when a number of properties at a state
+ parameters:
+ - count
+ - property
+ - speed
+ - name: set_floor_from_average_sensor_value
+ description: Set floor speed from first entry with average less than key
+ parameters:
+ - map
+ - name: set_ceiling_from_average_sensor_value
+ description: Set ceiling speed based on key transition values with average
+ parameters:
+ - map
+ - name: set_net_increase_speed
+ description: >
+ Set the speed increase delta based on a factor applied to
+ the delta increase size times the given value and property's
+ value difference
+ parameters:
+ - property
+ - factor
+ - delta
+ - name: set_net_decrease_speed
+ description: >
+ Set the speed decrease delta based on a factor applied to
+ the delta decrease size times the given value and property's
+ value difference
+ parameters:
+ - property
+ - factor
+ - delta
+
+events:
+ - name: missing_before_high_speed_air_zone0
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ group: air_cooled_zone0_fans
+ interface: xyz.openbmc_project.Inventory.Item
+ property:
+ name: Present
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property: false
+ speed:
+ value: 100
+ type: uint64_t
+ - name: missing_before_high_speed_air_zone1
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 1
+ group: air_cooled_zone1_fans
+ interface: xyz.openbmc_project.Inventory.Item
+ property:
+ name: Present
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property: false
+ speed:
+ value: 100
+ type: uint64_t
+ - name: missing_before_high_speed_air_zone2
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 2
+ group: air_cooled_zone2_fans
+ interface: xyz.openbmc_project.Inventory.Item
+ property:
+ name: Present
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property: false
+ speed:
+ value: 100
+ type: uint64_t
+ - name: fails_before_high_speed_air_zone0
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ group: air_cooled_zone0_fans
+ interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ property:
+ name: Functional
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property: false
+ speed:
+ value: 100
+ type: uint64_t
+ - name: fails_before_high_speed_air_zone1
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ group: air_cooled_zone1_fans
+ interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ property:
+ name: Functional
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property: false
+ speed:
+ value: 100
+ type: uint64_t
+ - name: fails_before_high_speed_air_zone2
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 1
+ group: air_cooled_zone2_fans
+ interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ property:
+ name: Functional
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property: false
+ speed:
+ value: 100
+ type: uint64_t
+ - name: missing_before_high_speed_water_and_air_zone0
+ zone_conditions:
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 0
+ group: water_and_air_cooled_zone0_fans
+ interface: xyz.openbmc_project.Inventory.Item
+ property:
+ name: Present
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property: false
+ speed:
+ value: 100
+ type: uint64_t
+ - name: missing_before_high_speed_water_and_air_zone2
+ zone_conditions:
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 2
+ group: water_and_air_cooled_zone2_fans
+ interface: xyz.openbmc_project.Inventory.Item
+ property:
+ name: Present
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property: false
+ speed:
+ value: 100
+ type: uint64_t
+ - name: fails_before_high_speed_water_and_air_zone0
+ zone_conditions:
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 0
+ group: water_and_air_cooled_zone0_fans
+ interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ property:
+ name: Functional
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property: false
+ speed:
+ value: 100
+ type: uint64_t
+ - name: fails_before_high_speed_water_and_air_zone2
+ zone_conditions:
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 2
+ group: water_and_air_cooled_zone2_fans
+ interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ property:
+ name: Functional
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property: false
+ speed:
+ value: 100
+ type: uint64_t
+ - name: set_air_cooled_speed_boundaries_based_on_ambient
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ group: zone2_ambient
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: set_floor_from_average_sensor_value
+ map:
+ value:
+ - 27000: 33
+ - 32000: 44
+ - 37000: 50
+ - 40000: 55
+ type: std::map<int64_t, uint64_t>
+ - name: set_ceiling_from_average_sensor_value
+ map:
+ value:
+ - 248: 69
+ - 27000: 100
+ type: std::map<int64_t, uint64_t>
+ - name: set_water_cooled_speed_boundaries_based_on_ambient
+ zone_conditions:
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 0
+ group: zone2_ambient
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: set_floor_from_average_sensor_value
+ map:
+ value:
+ - 27000: 29
+ - 32000: 41
+ - 37000: 48
+ - 40000: 55
+ type: std::map<int64_t, uint64_t>
+ - name: set_ceiling_from_average_sensor_value
+ map:
+ value:
+ - 248: 69
+ - 27000: 100
+ type: std::map<int64_t, uint64_t>
+ - name: speed_changes_based_on_regulator_temps
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 0
+ group: zone0_regulators
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ actions:
+ - name: set_net_increase_speed
+ property: 85000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 4
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property: 82000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 1
+ type: uint64_t
+ timer:
+ interval: 5
+ - name: speed_changes_based_on_pcie_temps
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 0
+ group: zone0_pcie
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ actions:
+ - name: set_net_increase_speed
+ property: 55000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 4
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property: 52000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 1
+ type: uint64_t
+ timer:
+ interval: 5
+ - name: occ_active_speed_changes
+ precondition:
+ name: property_states_match
+ groups:
+ - name: occ0_object
+ interface: org.open_power.OCC.Status
+ property:
+ name: OccActive
+ type: bool
+ value: true
+ - name: occ1_object
+ interface: org.open_power.OCC.Status
+ property:
+ name: OccActive
+ type: bool
+ value: true
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ events:
+ - name: speed_changes_based_on_core_temps_zone0
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ group: zone0_cores
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ actions:
+ - name: set_net_increase_speed
+ property: 73000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 4
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property: 70000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 1
+ type: uint64_t
+ timer:
+ interval: 5
+ - name: speed_changes_based_on_core_temps_zone1
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 1
+ group: zone1_cores
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ actions:
+ - name: set_net_increase_speed
+ property: 73000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 4
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property: 70000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 1
+ type: uint64_t
+ timer:
+ interval: 5
+ - name: speed_changes_based_on_dimm_temps_zone0
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 0
+ group: zone0_dimms
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ actions:
+ - name: set_net_increase_speed
+ property: 64000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 4
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property: 61000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 1
+ type: uint64_t
+ timer:
+ interval: 5
+ - name: speed_changes_based_on_dimm_temps_zone1
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 1
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 2
+ group: zone1_dimms
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ actions:
+ - name: set_net_increase_speed
+ property: 64000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 4
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property: 61000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 1
+ type: uint64_t
+ timer:
+ interval: 5
+ - name: speed_changes_based_on_gpu_core_temps
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ group: zone0_gpu_cores
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ actions:
+ - name: set_net_increase_speed
+ property: 78000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 6
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property: 75000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 1
+ type: uint64_t
+ timer:
+ interval: 5
+ - name: speed_changes_based_on_gpu_memory_temps
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ group: zone0_gpu_memory
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ actions:
+ - name: set_net_increase_speed
+ property: 80000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 6
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property: 77000
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 1
+ type: uint64_t
+ timer:
+ interval: 5
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config%.bbappend b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config%.bbappend
new file mode 100644
index 000000000..72d991c7e
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config%.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config%/fans.yaml b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config%/fans.yaml
new file mode 100755
index 000000000..5bda3ccdb
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config%/fans.yaml
@@ -0,0 +1,31 @@
+fans:
+ - inventory: /system/chassis/motherboard/fan4
+ cooling_zone: 0
+ cooling_profile: all
+ sensors:
+ - fan4
+ - inventory: /system/chassis/motherboard/fan5
+ cooling_zone: 1
+ cooling_profile: air
+ sensors:
+ - fan5
+ - inventory: /system/chassis/motherboard/fan0
+ cooling_zone: 2
+ cooling_profile: all
+ sensors:
+ - fan0
+ - inventory: /system/chassis/motherboard/fan1
+ cooling_zone: 2
+ cooling_profile: air
+ sensors:
+ - fan1
+ - inventory: /system/chassis/motherboard/fan2
+ cooling_zone: 2
+ cooling_profile: air
+ sensors:
+ - fan2
+ - inventory: /system/chassis/motherboard/fan3
+ cooling_zone: 2
+ cooling_profile: air
+ sensors:
+ - fan3
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native.bbappend b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native.bbappend
new file mode 100644
index 000000000..72d991c7e
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native/zone_conditions.yaml b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native/zone_conditions.yaml
new file mode 100644
index 000000000..0c8b3c5ff
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native/zone_conditions.yaml
@@ -0,0 +1,18 @@
+conditions:
+ - name: air_cooled_chassis
+ type: getProperty
+ properties:
+ - property: WaterCooled
+ interface: xyz.openbmc_project.Inventory.Decorator.CoolingType
+ path: /xyz/openbmc_project/inventory/system/chassis
+ type: bool
+ value: false
+
+ - name: water_and_air_cooled_chassis
+ type: getProperty
+ properties:
+ - property: WaterCooled
+ interface: xyz.openbmc_project.Inventory.Decorator.CoolingType
+ path: /xyz/openbmc_project/inventory/system/chassis
+ type: bool
+ value: true
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native.bbappend b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native.bbappend
new file mode 100644
index 000000000..6d4804d12
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native.bbappend
@@ -0,0 +1,2 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml
new file mode 100644
index 000000000..86458021a
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml
@@ -0,0 +1,56 @@
+manager_configuration:
+ power_on_delay: 20
+
+zone_configuration:
+
+#Air cooled zones
+- zone_conditions:
+ - name: air_cooled_chassis
+
+ zones:
+ - zone: 0
+ cooling_profiles:
+ - air
+ - all
+ full_speed: 100
+ default_floor: 76
+ increase_delay: 5
+ decrease_interval: 1
+ - zone: 1
+ cooling_profiles:
+ - air
+ - all
+ full_speed: 100
+ default_floor: 76
+ increase_delay: 5
+ decrease_interval: 1
+ - zone: 2
+ cooling_profiles:
+ - air
+ - all
+ full_speed: 100
+ default_floor: 76
+ increase_delay: 5
+ decrease_interval: 1
+
+#Water cooled zones
+- zone_conditions:
+ - name: water_and_air_cooled_chassis
+
+ zones:
+ - zone: 0
+ cooling_profiles:
+ - water
+ - all
+ full_speed: 100
+ default_floor: 76
+ increase_delay: 5
+ decrease_interval: 1
+ - zone: 2
+ cooling_profiles:
+ - water
+ - all
+ full_speed: 100
+ default_floor: 76
+ increase_delay: 5
+ decrease_interval: 1
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-monitor-config-native.bbappend b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-monitor-config-native.bbappend
new file mode 100644
index 000000000..72d991c7e
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-monitor-config-native.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-monitor-config-native/monitor.yaml b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-monitor-config-native/monitor.yaml
new file mode 100644
index 000000000..de86a5d4a
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-monitor-config-native/monitor.yaml
@@ -0,0 +1,58 @@
+fans:
+ - inventory: /system/chassis/motherboard/fan0
+ allowed_out_of_range_time: 30
+ deviation: 15
+ num_sensors_nonfunc_for_fan_nonfunc: 1
+ sensors:
+ - name: fan0
+ has_target: true
+
+ - inventory: /system/chassis/motherboard/fan1
+ allowed_out_of_range_time: 30
+ deviation: 15
+ num_sensors_nonfunc_for_fan_nonfunc: 1
+ sensors:
+ - name: fan1
+ has_target: true
+
+ - inventory: /system/chassis/motherboard/fan2
+ allowed_out_of_range_time: 30
+ deviation: 15
+ num_sensors_nonfunc_for_fan_nonfunc: 1
+ sensors:
+ - name: fan2
+ has_target: true
+
+ - inventory: /system/chassis/motherboard/fan3
+ allowed_out_of_range_time: 30
+ deviation: 15
+ num_sensors_nonfunc_for_fan_nonfunc: 1
+ sensors:
+ - name: fan3
+ has_target: true
+
+ - inventory: /system/chassis/motherboard/fan4
+ allowed_out_of_range_time: 30
+ deviation: 15
+ num_sensors_nonfunc_for_fan_nonfunc: 1
+ sensors:
+ - name: fan4
+ has_target: true
+
+ - inventory: /system/chassis/motherboard/fan5
+ allowed_out_of_range_time: 30
+ deviation: 15
+ num_sensors_nonfunc_for_fan_nonfunc: 1
+ sensors:
+ - name: fan5
+ has_target: true
+
+sensor_trust_groups:
+ - class: NonzeroSpeed
+ sensors:
+ - name: fan0
+ - name: fan1
+ - name: fan2
+ - name: fan3
+ - name: fan4
+ - name: fan5
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-presence-config-native%.bbappend b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-presence-config-native%.bbappend
new file mode 100644
index 000000000..72d991c7e
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-presence-config-native%.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-presence-config-native%/config.yaml b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-presence-config-native%/config.yaml
new file mode 100644
index 000000000..1e67ce56d
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-presence-config-native%/config.yaml
@@ -0,0 +1,53 @@
+- name: fan0
+ path: /system/chassis/motherboard/fan0
+ methods:
+ - type: tach
+ sensors:
+ - fan0
+ rpolicy:
+ type: anyof
+
+- name: fan1
+ path: /system/chassis/motherboard/fan1
+ methods:
+ - type: tach
+ sensors:
+ - fan1
+ rpolicy:
+ type: anyof
+
+- name: fan2
+ path: /system/chassis/motherboard/fan2
+ methods:
+ - type: tach
+ sensors:
+ - fan2
+ rpolicy:
+ type: anyof
+
+- name: fan3
+ path: /system/chassis/motherboard/fan3
+ methods:
+ - type: tach
+ sensors:
+ - fan3
+ rpolicy:
+ type: anyof
+
+- name: fan4
+ path: /system/chassis/motherboard/fan4
+ methods:
+ - type: tach
+ sensors:
+ - fan4
+ rpolicy:
+ type: anyof
+
+- name: fan5
+ path: /system/chassis/motherboard/fan5
+ methods:
+ - type: tach
+ sensors:
+ - fan5
+ rpolicy:
+ type: anyof
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy-native.bb b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy-native.bb
new file mode 100644
index 000000000..df6848d3c
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy-native.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Fan policy for Talos"
+PR = "r1"
+
+inherit native
+inherit obmc-phosphor-license
+inherit phosphor-dbus-monitor
+
+SRC_URI += "file://air-cooled.yaml"
+SRC_URI += "file://water-cooled.yaml"
+SRC_URI += "file://fan-errors.yaml"
+
+do_install() {
+ install -D ${WORKDIR}/air-cooled.yaml ${D}${config_dir}/air-cooled.yaml
+ install -D ${WORKDIR}/water-cooled.yaml ${D}${config_dir}/water-cooled.yaml
+ install -D ${WORKDIR}/fan-errors.yaml ${D}${config_dir}/fan-errors.yaml
+}
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/air-cooled.yaml b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/air-cooled.yaml
new file mode 100644
index 000000000..f98b3d8fe
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/air-cooled.yaml
@@ -0,0 +1,241 @@
+# Air cooled Talos fan policy for PDM.
+#
+# An air cooled Talos requires a minimum of one functional fan.
+# If the number of functional fans drops below that
+# power the system off.
+
+- name: fans
+ description: >
+ 'An air cooled Talos has six fans to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5
+
+- name: chassis state
+ description: >
+ 'Talos has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSISSTATE
+ path: /xyz/openbmc_project/state/chassis0
+
+- name: chassis
+ description: >
+ 'Talos has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSIS
+ path: /xyz/openbmc_project/inventory/system/chassis
+
+- name: fan present
+ description: >
+ 'Monitor the presence state of each fan.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.Inventory.Item
+ meta: PRESENT
+ property: Present
+
+- name: fan functional
+ description: >
+ 'Monitor the functional state of each fan.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ meta: FUNCTIONAL
+ property: Functional
+
+- name: chassis powered
+ description: >
+ 'Monitor the chassis power state.'
+ class: group
+ group: property
+ type: string
+ members:
+ - interface: xyz.openbmc_project.State.Chassis
+ meta: CHASSIS_STATE
+ property: CurrentPowerState
+
+- name: chassis air cooled
+ description: >
+ 'Monitor the chassis cooling type.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType
+ meta: COOLING_TYPE
+ property: WaterCooled
+
+- name: watch fan present
+ description: >
+ 'Trigger logic on fan presence state changes.'
+ class: watch
+ watch: property
+ paths: fans
+ properties: fan present
+ callback: check cooling type
+
+- name: watch fan functional
+ description: >
+ 'Trigger logic on fan functional state changes.'
+ class: watch
+ watch: property
+ paths: fans
+ properties: fan functional
+ callback: check cooling type
+
+- name: watch chassis state
+ description: >
+ 'Trigger logic on chassis power state changes.'
+ class: watch
+ watch: property
+ paths: chassis state
+ properties: chassis powered
+ callback: check cooling type
+
+- name: watch cooling type
+ description: >
+ 'Maintain a cache of the chassis cooling type.'
+ class: watch
+ watch: property
+ paths: chassis
+ properties: chassis air cooled
+
+- name: check cooling type
+ description: >
+ 'If this condition passes the chassis is air cooled.'
+ class: condition
+ condition: count
+ paths: chassis
+ properties: chassis air cooled
+ callback: check power
+ countop: '=='
+ countbound: 0
+ op: '=='
+ bound: true
+
+- name: check power
+ description: >
+ 'If the chassis has power, check fans.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fans
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check fans
+ description: >
+ 'Verify there are at least three functional fans, power off if not.'
+ class: callback
+ callback: group
+ members:
+ - check group presence
+ - check group functional
+
+- name: check group presence
+ description: >
+ 'If this condition passes more than one fan has been unplugged
+ for more than 25 seconds. Shut the system down. Count present
+ fans rather than non-present fans since the latter would pass
+ if the fan has not been created for some reason.
+
+ For a more detailed definition of unplugged, consult the documentation
+ of xyz.openbmc_project.Inventory.Item and/or the documentation
+ of the fan inventory object implementation.'
+ class: condition
+ condition: count
+ paths: fans
+ properties: fan present
+ defer: 25000000us
+ callback: log and shutdown
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check group functional
+ description: >
+ 'If this condition passes more than one fan in the group has been
+ marked as nonfunctional for five seconds. Shut the system down.
+
+ For a more detailed definition of nonfunctional, consult the documentation
+ of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the
+ documentation of the fan inventory object implementation.'
+ class: condition
+ condition: count
+ paths: fans
+ properties: fan functional
+ defer: 5000000us
+ callback: log and shutdown
+ countop: '>'
+ countbound: 1
+ op: '=='
+ bound: false
+
+- name: log and shutdown
+ description: >
+ 'Shut the system down, log an event in the journal, and create an
+ error log.'
+ class: callback
+ callback: group
+ members:
+ - shutdown
+ - log
+ - create shutdown error
+
+- name: shutdown
+ description: >
+ 'Shut down the system.'
+ class: callback
+ callback: method
+ service: org.freedesktop.systemd1
+ path: /org/freedesktop/systemd1
+ interface: org.freedesktop.systemd1.Manager
+ method: StartUnit
+ args:
+ - value: obmc-chassis-hard-poweroff@0.target
+ type: string
+ - value: replace
+ type: string
+
+- name: log
+ description: >
+ 'Log a shutdown event to the systemd journal.'
+ class: callback
+ callback: journal
+ paths: chassis state
+ properties: chassis powered
+ severity: ERR
+ message: Shutting down system. There are not enough functional fans.
+
+- name: create shutdown error
+ description: >
+ 'Create a Fan Shutdown Error log.'
+ class: callback
+ callback: elog
+ paths: chassis state
+ properties: chassis powered
+ error: xyz::openbmc_project::State::Shutdown::Inventory::Error::Fan
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/fan-errors.yaml b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/fan-errors.yaml
new file mode 100644
index 000000000..486e536ad
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/fan-errors.yaml
@@ -0,0 +1,894 @@
+# Talos fan error policy for PDM.
+#
+# * Create a NotPresent error if fan 0, 1, 2, 3, 4, 5, or 6 is not present for more
+# than 20 seconds.
+# * Create a Nonfunctional error if fan 0, 1, 2, 3, 4, 5, or 6 is not
+# functional for any amount of time.
+#
+# The system must be powered on in both of these cases.
+# If a water cooled system, don't create errors for fans 1, 2, 3, 5, or 6.
+# Note: An error is created each time the chassis powers on.
+#
+# * Watch for fans to become functional, and then resolve their errors
+
+- name: fan0
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
+
+- name: fan1
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1
+
+- name: fan2
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
+
+- name: fan3
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
+
+- name: fan4
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4
+
+- name: fan5
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5
+
+- name: chassis state
+ description: >
+ 'Talos has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSISSTATE
+ path: /xyz/openbmc_project/state/chassis0
+
+- name: chassis
+ description: >
+ 'Talos has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSIS
+ path: /xyz/openbmc_project/inventory/system/chassis
+
+
+- name: fan present
+ description: >
+ 'Monitor the presence state of each fan.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.Inventory.Item
+ meta: PRESENT
+ property: Present
+
+- name: fan functional
+ description: >
+ 'Monitor the functional state of each fan.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ meta: FUNCTIONAL
+ property: Functional
+
+- name: chassis powered
+ description: >
+ 'Monitor the chassis power state.'
+ class: group
+ group: property
+ type: string
+ members:
+ - interface: xyz.openbmc_project.State.Chassis
+ meta: CHASSIS_STATE
+ property: CurrentPowerState
+
+- name: chassis air cooled
+ description: >
+ 'The chassis cooling type.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType
+ meta: COOLING_TYPE
+ property: WaterCooled
+
+- name: watch chassis state
+ description: >
+ 'Trigger logic on chassis power state changes.'
+ class: watch
+ watch: property
+ paths: chassis state
+ properties: chassis powered
+ callback: check power
+
+- name: watch fan0 presence
+ description: >
+ 'Trigger logic on fan0 presence state changes.'
+ class: watch
+ watch: property
+ paths: fan0
+ properties: fan present
+ callback: check power fan0 presence
+
+- name: watch fan0 functional
+ description: >
+ 'Trigger logic on fan0 functional state changes.'
+ class: watch
+ watch: property
+ paths: fan0
+ properties: fan functional
+ callback: check power fan0 functional
+
+- name: watch fan1 presence
+ description: >
+ 'Trigger logic on fan1 presence state changes.'
+ class: watch
+ watch: property
+ paths: fan1
+ properties: fan present
+ callback: check power fan1 presence
+
+- name: watch fan1 functional
+ description: >
+ 'Trigger logic on fan1 functional state changes.'
+ class: watch
+ watch: property
+ paths: fan1
+ properties: fan functional
+ callback: check power fan1 functional
+
+- name: watch fan2 presence
+ description: >
+ 'Trigger logic on fan2 presence state changes.'
+ class: watch
+ watch: property
+ paths: fan2
+ properties: fan present
+ callback: check power fan2 presence
+
+- name: watch fan2 functional
+ description: >
+ 'Trigger logic on fan2 functional state changes.'
+ class: watch
+ watch: property
+ paths: fan2
+ properties: fan functional
+ callback: check power fan2 functional
+
+- name: watch fan3 presence
+ description: >
+ 'Trigger logic on fan3 presence state changes.'
+ class: watch
+ watch: property
+ paths: fan3
+ properties: fan present
+ callback: check power fan3 presence
+
+- name: watch fan3 functional
+ description: >
+ 'Trigger logic on fan3 functional state changes.'
+ class: watch
+ watch: property
+ paths: fan3
+ properties: fan functional
+ callback: check power fan3 functional
+
+- name: watch fan4 presence
+ description: >
+ 'Trigger logic on fan4 presence state changes.'
+ class: watch
+ watch: property
+ paths: fan4
+ properties: fan present
+ callback: check power fan4 presence
+
+- name: watch fan4 functional
+ description: >
+ 'Trigger logic on fan4 functional state changes.'
+ class: watch
+ watch: property
+ paths: fan4
+ properties: fan functional
+ callback: check power fan4 functional
+
+- name: watch fan0 functional for resolving error logs
+ description: >
+ 'On fan functional state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: fan0
+ properties: fan functional
+ callback: resolve fan0 errors if functional
+
+- name: watch fan1 functional for resolving error logs
+ description: >
+ 'On fan functional state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: fan1
+ properties: fan functional
+ callback: resolve fan1 errors if functional
+
+- name: watch fan2 functional for resolving error logs
+ description: >
+ 'On fan functional state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: fan2
+ properties: fan functional
+ callback: resolve fan2 errors if functional
+
+- name: watch fan3 functional for resolving error logs
+ description: >
+ 'On fan functional state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: fan3
+ properties: fan functional
+ callback: resolve fan3 errors if functional
+
+- name: watch fan4 functional for resolving error logs
+ description: >
+ 'On fan functional state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: fan4
+ properties: fan functional
+ callback: resolve fan4 errors if functional
+
+- name: watch fan5 functional for resolving error logs
+ description: >
+ 'On fan functional state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: fan5
+ properties: fan functional
+ callback: resolve fan5 errors if functional
+
+- name: check power
+ description: >
+ 'If the chassis has power, check all fans.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fans
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan0 presence
+ description: >
+ 'If the chassis has power, check presence of fan0.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fan0 presence
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan0 functional
+ description: >
+ 'If the chassis has power, check functional of fan0.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fan0 functional
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan1 presence
+ description: >
+ 'If the chassis has power, check presence of fan1.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fan1 presence
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan1 functional
+ description: >
+ 'If the chassis has power, check functional of fan1.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fan1 functional
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan2 presence
+ description: >
+ 'If the chassis has power, check presence of fan2.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fan2 presence
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan2 functional
+ description: >
+ 'If the chassis has power, check functional of fan2.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fan2 functional
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan3 presence
+ description: >
+ 'If the chassis has power, check presence of fan3.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fan3 presence
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan3 functional
+ description: >
+ 'If the chassis has power, check functional of fan3.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fan3 functional
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan4 functional
+ description: >
+ 'If the chassis has power, check functional of fan4.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fan4 functional
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan5 functional
+ description: >
+ 'If the chassis has power, check functional of fan5.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fan5 functional
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check fans
+ description: >
+ 'Verify each of the 3 fans are present.'
+ class: callback
+ callback: group
+ members:
+ - check fan0 presence
+ - check fan1 presence
+ - check fan2 presence
+ - check fan3 presence
+ - check fan4 presence
+ - check fan5 presence
+ - check fan0 functional
+ - check fan1 functional
+ - check fan2 functional
+ - check fan3 functional
+ - check fan4 functional
+ - check fan5 functional
+
+- name: check fan0 presence
+ description: >
+ 'If this condition passes fan0 has been unplugged for more than 20 seconds.'
+ class: condition
+ condition: count
+ paths: fan0
+ properties: fan present
+ defer: 20000000us
+ callback: notpresent fan0 error
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check fan0 functional
+ description: >
+ 'If this condition passes fan0 has been marked as nonfunctional.'
+ class: condition
+ condition: count
+ paths: fan0
+ properties: fan functional
+ callback: nonfunctional fan0 error
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: false
+
+- name: check fan1 presence
+ description: >
+ 'If this condition passes fan1 has been unplugged for more than 20 seconds.
+ Fan 1 is not in a water cooled Talos, so check for cooling type
+ before creating an error.'
+ class: condition
+ condition: count
+ paths: fan1
+ properties: fan present
+ defer: 20000000us
+ callback: check cooling type notpresent error
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check fan1 functional
+ description: >
+ 'If this condition passes fan1 has been marked as nonfunctional.
+ Fan 1 is not in a water cooled Talos, so check for cooling type
+ before creating an error.'
+ class: condition
+ condition: count
+ paths: fan1
+ properties: fan functional
+ callback: check cooling type nonfunctional error
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: false
+
+- name: check fan2 presence
+ description: >
+ 'If this condition passes fan2 has been unplugged for more than 20 seconds.
+ Fan 2 is not in a water cooled Talos, so check for cooling type
+ before creating an error.'
+ class: condition
+ condition: count
+ paths: fan2
+ properties: fan present
+ defer: 20000000us
+ callback: check cooling type notpresent error
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check fan2 functional
+ description: >
+ 'If this condition passes fan2 has been marked as nonfunctional.
+ Fan 2 is not in a water cooled Talos, so check for cooling type
+ before creating an error.'
+ class: condition
+ condition: count
+ paths: fan2
+ properties: fan functional
+ callback: check cooling type nonfunctional error
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: false
+
+- name: check fan3 presence
+ description: >
+ 'If this condition passes fan3 has been unplugged for more than 20 seconds.
+ Fan 3 is not in a water cooled Talos, so check for cooling type
+ before creating an error.'
+ class: condition
+ condition: count
+ paths: fan3
+ properties: fan present
+ defer: 20000000us
+ callback: check cooling type notpresent error
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check fan3 functional
+ description: >
+ 'If this condition passes fan3 has been marked as nonfunctional.
+ Fan 3 is not in a water cooled Talos, so check for cooling type
+ before creating an error.'
+ class: condition
+ condition: count
+ paths: fan3
+ properties: fan functional
+ callback: check cooling type nonfunctional error
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: false
+
+- name: check fan4 presence
+ description: >
+ 'If this condition passes fan4 has been unplugged for more than 20 seconds.'
+ class: condition
+ condition: count
+ paths: fan4
+ properties: fan present
+ defer: 20000000us
+ callback: notpresent fan4 error
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check fan4 functional
+ description: >
+ 'If this condition passes fan4 has been marked as nonfunctional.'
+ class: condition
+ condition: count
+ paths: fan4
+ properties: fan functional
+ callback: nonfunctional fan4 error
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: false
+
+- name: check fan5 presence
+ description: >
+ 'If this condition passes fan5 has been unplugged for more than 20 seconds.
+ Fan 5 is not in a water cooled Talos, so check for cooling type
+ before creating an error.'
+ class: condition
+ condition: count
+ paths: fan5
+ properties: fan present
+ defer: 20000000us
+ callback: check cooling type notpresent error
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check fan5 functional
+ description: >
+ 'If this condition passes fan5 has been marked as nonfunctional.
+ Fan 5 is not in a water cooled Talos, so check for cooling type
+ before creating an error.'
+ class: condition
+ condition: count
+ paths: fan5
+ properties: fan functional
+ callback: check cooling type nonfunctional error
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: false
+
+- name: check cooling type nonfunctional error
+ description: >
+ 'If this condition passes the chassis is air cooled and will create a
+ nonfunctional error for fans 1, 2, 3, 5, and 6.'
+ class: condition
+ condition: count
+ paths: chassis
+ properties: chassis air cooled
+ callback: nonfunctional fan1 error
+ countop: '=='
+ countbound: 0
+ op: '=='
+ bound: true
+
+- name: check cooling type notpresent error
+ description: >
+ 'If this condition passes the chassis is air cooled and will create a
+ notpresent error for fans 1, 2, 3, 5, and 6.'
+ class: condition
+ condition: count
+ paths: chassis
+ properties: chassis air cooled
+ callback: notpresent fan1 error
+ countop: '=='
+ countbound: 0
+ op: '=='
+ bound: true
+
+- name: notpresent fan0 error
+ class: callback
+ callback: elog
+ paths: fan0
+ properties: fan present
+ error: xyz::openbmc_project::Inventory::Error::NotPresent
+ metadata:
+ - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
+ type: string
+
+- name: nonfunctional fan0 error
+ class: callback
+ callback: elog
+ paths: fan0
+ properties: fan functional
+ error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+ metadata:
+ - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
+ type: string
+
+- name: notpresent fan1 error
+ class: callback
+ callback: elog
+ paths: fan1
+ properties: fan present
+ error: xyz::openbmc_project::Inventory::Error::NotPresent
+ metadata:
+ - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1
+ type: string
+
+- name: nonfunctional fan1 error
+ class: callback
+ callback: elog
+ paths: fan1
+ properties: fan functional
+ error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+ metadata:
+ - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1
+ type: string
+
+- name: notpresent fan2 error
+ class: callback
+ callback: elog
+ paths: fan2
+ properties: fan present
+ error: xyz::openbmc_project::Inventory::Error::NotPresent
+ metadata:
+ - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
+ type: string
+
+- name: nonfunctional fan2 error
+ class: callback
+ callback: elog
+ paths: fan2
+ properties: fan functional
+ error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+ metadata:
+ - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
+ type: string
+
+- name: notpresent fan3 error
+ class: callback
+ callback: elog
+ paths: fan3
+ properties: fan present
+ error: xyz::openbmc_project::Inventory::Error::NotPresent
+ metadata:
+ - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
+ type: string
+
+- name: nonfunctional fan3 error
+ class: callback
+ callback: elog
+ paths: fan3
+ properties: fan functional
+ error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+ metadata:
+ - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
+ type: string
+
+- name: notpresent fan4 error
+ class: callback
+ callback: elog
+ paths: fan4
+ properties: fan present
+ error: xyz::openbmc_project::Inventory::Error::NotPresent
+ metadata:
+ - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4
+ type: string
+
+- name: nonfunctional fan4 error
+ class: callback
+ callback: elog
+ paths: fan4
+ properties: fan functional
+ error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+ metadata:
+ - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4
+ type: string
+
+- name: notpresent fan5 error
+ class: callback
+ callback: elog
+ paths: fan5
+ properties: fan present
+ error: xyz::openbmc_project::Inventory::Error::NotPresent
+ metadata:
+ - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5
+ type: string
+
+- name: nonfunctional fan5 error
+ class: callback
+ callback: elog
+ paths: fan5
+ properties: fan functional
+ error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+ metadata:
+ - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+ value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5
+ type: string
+
+- name: resolve fan0 errors if functional
+ description: >
+ 'If fan0 is functional, call the resolve fan0 errors callback.'
+ class: condition
+ condition: count
+ paths: fan0
+ properties: fan functional
+ callback: resolve fan0 errors
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: true
+
+#Go ahead and do this on water cooled as well
+- name: resolve fan1 errors if functional
+ description: >
+ 'If fan1 is functional, call the resolve fan1 errors callback.'
+ class: condition
+ condition: count
+ paths: fan1
+ properties: fan functional
+ callback: resolve fan1 errors
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: true
+
+#Go ahead and do this on water cooled as well
+- name: resolve fan2 errors if functional
+ description: >
+ 'If fan2 is functional, call the resolve fan2 errors callback.'
+ class: condition
+ condition: count
+ paths: fan2
+ properties: fan functional
+ callback: resolve fan2 errors
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: true
+
+#Go ahead and do this on water cooled as well
+- name: resolve fan3 errors if functional
+ description: >
+ 'If fan3 is functional, call the resolve fan3 errors callback.'
+ class: condition
+ condition: count
+ paths: fan3
+ properties: fan functional
+ callback: resolve fan3 errors
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: true
+
+- name: resolve fan4 errors if functional
+ description: >
+ 'If fan4 is functional, call the resolve fan4 errors callback.'
+ class: condition
+ condition: count
+ paths: fan4
+ properties: fan functional
+ callback: resolve fan4 errors
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: true
+
+#Go ahead and do this on water cooled as well
+- name: resolve fan5 errors if functional
+ description: >
+ 'If fan5 is functional, call the resolve fan5 errors callback.'
+ class: condition
+ condition: count
+ paths: fan5
+ properties: fan functional
+ callback: resolve fan5 errors
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: true
+
+- name: resolve fan0 errors
+ class: callback
+ callback: resolve callout
+ paths: fan0
+ properties: fan functional
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
+
+- name: resolve fan1 errors
+ class: callback
+ callback: resolve callout
+ paths: fan1
+ properties: fan functional
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1
+
+- name: resolve fan2 errors
+ class: callback
+ callback: resolve callout
+ paths: fan2
+ properties: fan functional
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
+
+- name: resolve fan3 errors
+ class: callback
+ callback: resolve callout
+ paths: fan3
+ properties: fan functional
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
+
+- name: resolve fan4 errors
+ class: callback
+ callback: resolve callout
+ paths: fan4
+ properties: fan functional
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4
+
+- name: resolve fan5 errors
+ class: callback
+ callback: resolve callout
+ paths: fan5
+ properties: fan functional
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/water-cooled.yaml b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/water-cooled.yaml
new file mode 100644
index 000000000..689633a52
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-policy/water-cooled.yaml
@@ -0,0 +1,233 @@
+# Water cooled Talos fan policy for PDM.
+#
+# A water cooled Talos requires a minimum of one functional fan and one functional pump.
+# If the number of functional rotors drops below that
+# power the system off.
+
+- name: fans
+ description: >
+ 'A water cooled Talos has two rotors to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4
+
+- name: chassis state
+ description: >
+ 'Talos has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSISSTATE
+ path: /xyz/openbmc_project/state/chassis0
+
+- name: chassis
+ description: >
+ 'Talos has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSIS
+ path: /xyz/openbmc_project/inventory/system/chassis
+
+- name: fan present
+ description: >
+ 'Monitor the presence state of each fan.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.Inventory.Item
+ meta: PRESENT
+ property: Present
+
+- name: fan functional
+ description: >
+ 'Monitor the functional state of each fan.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ meta: FUNCTIONAL
+ property: Functional
+
+- name: chassis powered
+ description: >
+ 'Monitor the chassis power state.'
+ class: group
+ group: property
+ type: string
+ members:
+ - interface: xyz.openbmc_project.State.Chassis
+ meta: CHASSIS_STATE
+ property: CurrentPowerState
+
+- name: chassis water cooled
+ description: >
+ 'Monitor the chassis cooling type.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType
+ meta: COOLING_TYPE
+ property: WaterCooled
+
+- name: watch fan present
+ description: >
+ 'Trigger logic on fan presence state changes.'
+ class: watch
+ watch: property
+ paths: fans
+ properties: fan present
+ callback: check cooling type
+
+- name: watch fan functional
+ description: >
+ 'Trigger logic on fan functional state changes.'
+ class: watch
+ watch: property
+ paths: fans
+ properties: fan functional
+ callback: check cooling type
+
+- name: watch chassis state
+ description: >
+ 'Trigger logic on chassis power state changes.'
+ class: watch
+ watch: property
+ paths: chassis state
+ properties: chassis powered
+ callback: check cooling type
+
+- name: watch cooling type
+ description: >
+ 'Maintain a cache of the chassis cooling type.'
+ class: watch
+ watch: property
+ paths: chassis
+ properties: chassis water cooled
+
+- name: check cooling type
+ description: >
+ 'If this condition passes the chassis is water cooled.'
+ class: condition
+ condition: count
+ paths: chassis
+ properties: chassis water cooled
+ callback: check power
+ countop: '=='
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check power
+ description: >
+ 'If the chassis has power, check fans.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check fans
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check fans
+ description: >
+ 'Verify there are at least two functional fans, power off if not.'
+ class: callback
+ callback: group
+ members:
+ - check group presence
+ - check group functional
+
+- name: check group presence
+ description: >
+ 'If this condition passes more than one fan has been unplugged
+ for more than 25 seconds. Shut the system down. Count present
+ fans rather than non-present fans since the latter would pass
+ if the fan has not been created for some reason.
+
+ For a more detailed definition of unplugged, consult the documentation
+ of xyz.openbmc_project.Inventory.Item and/or the documentation
+ of the fan inventory object implementation.'
+ class: condition
+ condition: count
+ paths: fans
+ properties: fan present
+ defer: 25000000us
+ callback: log and shutdown
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check group functional
+ description: >
+ 'If this condition passes more than one fan in the group has been marked
+ as nonfunctional for five seconds. Shut the system down.
+
+ For a more detailed definition of nonfunctional, consult the documentation
+ of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the
+ documentation of the fan inventory object implementation.'
+ class: condition
+ condition: count
+ paths: fans
+ properties: fan functional
+ defer: 5000000us
+ callback: log and shutdown
+ countop: '>'
+ countbound: 1
+ op: '=='
+ bound: false
+
+- name: log and shutdown
+ description: >
+ 'Shut the system down, log an event in the journal, and create an
+ error log.'
+ class: callback
+ callback: group
+ members:
+ - shutdown
+ - log
+ - create shutdown error
+
+- name: shutdown
+ description: >
+ 'Shut down the system.'
+ class: callback
+ callback: method
+ service: org.freedesktop.systemd1
+ path: /org/freedesktop/systemd1
+ interface: org.freedesktop.systemd1.Manager
+ method: StartUnit
+ args:
+ - value: obmc-chassis-hard-poweroff@0.target
+ type: string
+ - value: replace
+ type: string
+
+- name: log
+ description: >
+ 'Log a shutdown event to the systemd journal.'
+ class: callback
+ callback: journal
+ paths: chassis state
+ properties: chassis powered
+ severity: ERR
+ message: Shutting down system. There are not enough functional fans.
+
+- name: create shutdown error
+ description: >
+ 'Create a Fan Shutdown Error log.'
+ class: callback
+ callback: elog
+ paths: chassis state
+ properties: chassis powered
+ error: xyz::openbmc_project::State::Shutdown::Inventory::Error::Fan
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog.bb b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog.bb
new file mode 100644
index 000000000..19be898dd
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Talos fan watchdog services"
+PR = "r1"
+
+inherit obmc-phosphor-license
+inherit obmc-phosphor-systemd
+
+RDEPENDS_${PN} += "virtual/obmc-gpio-monitor"
+RDEPENDS_${PN} += "busybox"
+
+RESET_SERVICE = "talos-reset-fan-watchdog.service"
+TGTFMT = "obmc-chassis-poweron@0.target"
+RESET_FMT = "../${RESET_SERVICE}:${TGTFMT}.requires/${RESET_SERVICE}"
+
+MONITOR_SERVICE = "talos-fan-watchdog-monitor@.service"
+
+WATCHDOG_SERVICE = "talos-fan-watchdog.service"
+WATCHDOG_FMT = "../${WATCHDOG_SERVICE}:${TGTFMT}.requires/${WATCHDOG_SERVICE}"
+
+SYSTEMD_SERVICE_${PN} += "${RESET_SERVICE} ${MONITOR_SERVICE} ${WATCHDOG_SERVICE}"
+SYSTEMD_LINK_${PN} += "${RESET_FMT} ${WATCHDOG_FMT}"
+SYSTEMD_ENVIRONMENT_FILE_${PN} += "obmc/talos-fan-watchdog/reset-fan-watchdog.conf"
+SYSTEMD_ENVIRONMENT_FILE_${PN} += "obmc/talos-fan-watchdog/fan-watchdog.conf"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/obmc/talos-fan-watchdog/fan-watchdog.conf b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/obmc/talos-fan-watchdog/fan-watchdog.conf
new file mode 100644
index 000000000..b54faae3b
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/obmc/talos-fan-watchdog/fan-watchdog.conf
@@ -0,0 +1,3 @@
+TIMEOUT=3
+INTERVAL=1
+DEVICE=/dev/watchdog0
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/obmc/talos-fan-watchdog/reset-fan-watchdog.conf b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/obmc/talos-fan-watchdog/reset-fan-watchdog.conf
new file mode 100644
index 000000000..b4e5ce74e
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/obmc/talos-fan-watchdog/reset-fan-watchdog.conf
@@ -0,0 +1,4 @@
+GPIO_PATH=/dev/gpiochip0
+GPIO=109
+DELAY=1
+ACTION=low_high
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-fan-watchdog-monitor@.service b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-fan-watchdog-monitor@.service
new file mode 100644
index 000000000..945561b50
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-fan-watchdog-monitor@.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Fan Watchdog Failure Monitor
+
+#This can get called every time a process dies, so ensure it's never limited
+StartLimitIntervalSec=0
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/env phosphor-unit-failure-monitor --source %i --target obmc-fan-watchdog-takeover.target --action start
+SyslogIdentifier=phosphor-unit-failure-monitor
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-fan-watchdog.service b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-fan-watchdog.service
new file mode 100644
index 000000000..c4696f72b
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-fan-watchdog.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Talos Fan Watchdog Daemon
+Wants=phosphor-fan-control-init@0.service
+Before=phosphor-fan-control-init@0.service
+Conflicts=obmc-fan-watchdog-takeover.target
+
+[Service]
+EnvironmentFile={envfiledir}/obmc/talos-fan-watchdog/fan-watchdog.conf
+ExecStart=/sbin/watchdog -T ${{TIMEOUT}} -t ${{INTERVAL}} -F ${{DEVICE}}
+KillSignal=SIGKILL
+
+[Install]
+RequiredBy=obmc-chassis-poweron@0.target
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-reset-fan-watchdog.service b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-reset-fan-watchdog.service
new file mode 100644
index 000000000..934892bc4
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-fan-watchdog/talos-reset-fan-watchdog.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Talos Fan Watchdog Reset
+Wants=phosphor-fan-control-init@0.service
+Before=phosphor-fan-control-init@0.service
+Conflicts=obmc-chassis-poweroff@0.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+EnvironmentFile={envfiledir}/obmc/talos-fan-watchdog/reset-fan-watchdog.conf
+ExecStart=/usr/bin/env phosphor-gpio-util -p ${{GPIO_PATH}} -g ${{GPIO}} -a ${{ACTION}} -d ${{DELAY}}
+SyslogIdentifier=phosphor-gpio-util
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-thermal-policy-native.bb b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-thermal-policy-native.bb
new file mode 100644
index 000000000..1b20e53a5
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-thermal-policy-native.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Thermal policy for Talos"
+PR = "r1"
+
+inherit native
+inherit obmc-phosphor-license
+inherit phosphor-dbus-monitor
+
+SRC_URI += "file://thermal-policy.yaml"
+
+do_install() {
+ install -D ${WORKDIR}/thermal-policy.yaml ${D}${config_dir}/thermal-policy.yaml
+}
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-thermal-policy/thermal-policy.yaml b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-thermal-policy/thermal-policy.yaml
new file mode 100644
index 000000000..28ba81cad
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/fans/talos-thermal-policy/thermal-policy.yaml
@@ -0,0 +1,200 @@
+# Talos thermal policy for PDM.
+#
+# Shut down a Talos system if more than three POWER9 cores
+# have a temperature greater than 115 degrees Celcius.
+
+
+- name: core sensors
+ description: >
+ 'Talos has two POWER9 chips with up to 24 cores each.'
+ class: group
+ group: path
+ members:
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core0_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core1_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core2_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core3_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core4_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core5_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core6_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core7_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core8_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core9_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core10_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core11_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core12_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core13_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core14_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core15_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core16_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core17_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core18_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core19_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core20_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core21_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core22_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p0_core23_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core0_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core1_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core2_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core3_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core4_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core5_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core6_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core7_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core8_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core9_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core10_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core11_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core12_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core13_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core14_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core15_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core16_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core17_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core18_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core19_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core20_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core21_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core22_temp
+ - meta: SENSOR
+ path: /xyz/openbmc_project/sensors/temperature/p1_core23_temp
+
+- name: core temp
+ description: >
+ 'Monitor the temperature of each core.'
+ class: group
+ group: property
+ type: int64
+ members:
+ - interface: xyz.openbmc_project.Sensor.Value
+ meta: TEMP
+ property: Value
+
+- name: watch core temps
+ description: >
+ 'Trigger logic on core temp changes.'
+ class: watch
+ watch: property
+ paths: core sensors
+ properties: core temp
+ callback: check temps
+
+- name: check temps
+ description: >
+ 'If this condition passes at least three cores are running
+ too hot. Shut the system down.'
+ class: condition
+ condition: count
+ paths: core sensors
+ properties: core temp
+ callback: log and shutdown
+ countop: '>='
+ countbound: 3
+ op: '>='
+ bound: 115000
+
+- name: log and shutdown
+ description: >
+ 'Shut the system down and log an event.'
+ class: callback
+ callback: group
+ members:
+ - shutdown
+ - log
+ - create criticalhigh error
+ - create shutdown error
+
+- name: shutdown
+ description: >
+ 'Shut down the system.'
+ class: callback
+ callback: method
+ service: org.freedesktop.systemd1
+ path: /org/freedesktop/systemd1
+ interface: org.freedesktop.systemd1.Manager
+ method: StartUnit
+ args:
+ - value: obmc-chassis-hard-poweroff@0.target
+ type: string
+ - value: replace
+ type: string
+
+- name: log
+ description: >
+ 'Log a shutdown event to the systemd journal.'
+ class: callback
+ callback: journal
+ paths: core sensors
+ properties: core temp
+ severity: ERR
+ message: The system is too hot. Shutting down.
+
+- name: create criticalhigh error
+ description: >
+ 'Create a CriticalHigh Error log.'
+ class: callback
+ callback: elog
+ paths: core sensors
+ properties: core temp
+ error: xyz::openbmc_project::Sensor::Threshold::Error::CriticalHigh
+ metadata:
+ - name: xyz::openbmc_project::Sensor::Threshold::CriticalHigh::SENSOR_TYPE
+ value: temperature
+ type: string
+
+- name: create shutdown error
+ description: >
+ 'Create a SystemShutdown Error log.'
+ class: callback
+ callback: elog
+ paths: core sensors
+ properties: core temp
+ error: xyz::openbmc_project::State::Shutdown::ThermalEvent::Error::Processor
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/ipmi/phosphor-ipmi-fru-read-bmc-inventory%/bmc-fru-config.yaml b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/ipmi/phosphor-ipmi-fru-read-bmc-inventory%/bmc-fru-config.yaml
new file mode 100644
index 000000000..8009eadaf
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/ipmi/phosphor-ipmi-fru-read-bmc-inventory%/bmc-fru-config.yaml
@@ -0,0 +1,36 @@
+50:
+ /system/chassis/motherboard/fan0:
+ xyz.openbmc_project.Inventory.Item:
+ PrettyName:
+ IPMIFruProperty: Product Name
+ IPMIFruSection: Product
+51:
+ /system/chassis/motherboard/fan1:
+ xyz.openbmc_project.Inventory.Item:
+ PrettyName:
+ IPMIFruProperty: Product Name
+ IPMIFruSection: Product
+52:
+ /system/chassis/motherboard/fan2:
+ xyz.openbmc_project.Inventory.Item:
+ PrettyName:
+ IPMIFruProperty: Product Name
+ IPMIFruSection: Product
+53:
+ /system/chassis/motherboard/fan3:
+ xyz.openbmc_project.Inventory.Item:
+ PrettyName:
+ IPMIFruProperty: Product Name
+ IPMIFruSection: Product
+54:
+ /system/chassis/motherboard/fan4:
+ xyz.openbmc_project.Inventory.Item:
+ PrettyName:
+ IPMIFruProperty: Product Name
+ IPMIFruSection: Product
+55:
+ /system/chassis/motherboard/fan5:
+ xyz.openbmc_project.Inventory.Item:
+ PrettyName:
+ IPMIFruProperty: Product Name
+ IPMIFruSection: Product
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bbappend b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bbappend
index 239a3fffc..7a7c879e1 100644
--- a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bbappend
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/packagegroups/packagegroup-obmc-apps.bbappend
@@ -1 +1 @@
-RDEPENDS_${PN}-inventory += " openpower-occ-control"
+RDEPENDS_${PN}-inventory += " openpower-fru-vpd openpower-occ-control phosphor-cooling-type"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%.bbappend b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%.bbappend
index eb5e22324..c24c1bd2c 100644
--- a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%.bbappend
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%.bbappend
@@ -1,12 +1,25 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
-OCCS = " \
+TALOS_CHIPS = " \
+ pwm-tacho-controller@1e786000 \
+ i2c@1e78a000/i2c-bus@440/max31785@52 \
+ i2c@1e78a000/i2c-bus@440/power-supply@68 \
+ i2c@1e78a000/i2c-bus@440/power-supply@69 \
+ "
+TALOS_ITEMSFMT = "ahb/apb/{0}.conf"
+TALOS_ITEMS = "${@compose_list(d, 'TALOS_ITEMSFMT', 'TALOS_CHIPS')}"
+
+TALOS_OCCS = " \
sbefifo@2400/occ@1/occ-hwmon@1 \
hub@3400/cfam@1,0/sbefifo@2400/occ@2/occ-hwmon@2 \
"
-OCCSFMT = "gpio-fsi/cfam@0,0/{0}.conf"
-OCCITEMS = "${@compose_list(d, 'OCCSFMT', 'OCCS')}"
+TALOS_OCCSFMT = "gpio-fsi/cfam@0,0/{0}.conf"
+TALOS_OCCITEMS = "${@compose_list(d, 'TALOS_OCCSFMT', 'TALOS_OCCS')}"
ENVS = "obmc/hwmon/{0}"
-SYSTEMD_ENVIRONMENT_FILE_${PN} += "${@compose_list(d, 'ENVS', 'OCCITEMS')}"
+SYSTEMD_ENVIRONMENT_FILE_${PN} += "${@compose_list(d, 'ENVS', 'TALOS_ITEMS')}"
+SYSTEMD_ENVIRONMENT_FILE_${PN} += "${@compose_list(d, 'ENVS', 'TALOS_OCCITEMS')}"
+
+SYSTEMD_ENVIRONMENT_FILE_max31785-msl += "obmc/hwmon-max31785/talos.conf"
+SYSTEMD_LINK_max31785-msl += "../phosphor-max31785-msl@.service:${SYSTEMD_DEFAULT_TARGET}.wants/phosphor-max31785-msl@talos.service"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon-max31785/talos.conf b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon-max31785/talos.conf
new file mode 100644
index 000000000..0fc81037c
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon-max31785/talos.conf
@@ -0,0 +1,3 @@
+BUS=12
+PATHS="/system/chassis/motherboard/fan0 /system/chassis/motherboard/fan1 /system/chassis/motherboard/fan2 /system/chassis/motherboard/fan3 /system/chassis/motherboard/fan4 /system/chassis/motherboard/fan5"
+REVISION=0x3030
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/max31785@52.conf b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/max31785@52.conf
new file mode 100644
index 000000000..e9db1d41d
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/max31785@52.conf
@@ -0,0 +1,13 @@
+LABEL_fan1 = "fan0"
+LABEL_fan2 = "fan1"
+LABEL_fan3 = "fan2"
+LABEL_fan4 = "fan3"
+LABEL_fan5 = "fan5"
+LABEL_fan6 = "fan4"
+
+ENABLE_fan1 = "1"
+ENABLE_fan2 = "1"
+ENABLE_fan3 = "1"
+ENABLE_fan4 = "1"
+ENABLE_fan5 = "1"
+ENABLE_fan6 = "1"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/power-supply@68.conf b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/power-supply@68.conf
new file mode 100644
index 000000000..e463b517c
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/power-supply@68.conf
@@ -0,0 +1,23 @@
+LABEL_in1="ps1_input_voltage"
+WARNHI_in1="290000"
+WARNLO_in1="200000"
+CRITHI_in1="300000"
+CRITLO_in1="180000"
+
+LABEL_in2="ps1_output_voltage"
+WARNHI_in2="12700"
+WARNLO_in2="0"
+CRITHI_in2="13000"
+CRITLO_in2="0"
+
+LABEL_curr1="ps1_output_current"
+WARNHI_curr1="170000"
+WARNLO_curr1="0"
+CRITHI_curr1="180000"
+CRITLO_curr1="0"
+
+LABEL_power1="ps1_input_power"
+WARNHI_power1="2350000000"
+WARNLO_power1="0"
+CRITHI_power1="2500000000"
+CRITLO_power1="0"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/power-supply@69.conf b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/power-supply@69.conf
new file mode 100644
index 000000000..2fadbdec0
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/i2c@1e78a000/i2c-bus@440/power-supply@69.conf
@@ -0,0 +1,23 @@
+LABEL_in1="ps0_input_voltage"
+WARNHI_in1="290000"
+WARNLO_in1="200000"
+CRITHI_in1="300000"
+CRITLO_in1="180000"
+
+LABEL_in2="ps0_output_voltage"
+WARNHI_in2="12700"
+WARNLO_in2="0"
+CRITHI_in2="13000"
+CRITLO_in2="0"
+
+LABEL_curr1="ps0_output_current"
+WARNHI_curr1="170000"
+WARNLO_curr1="0"
+CRITHI_curr1="180000"
+CRITLO_curr1="0"
+
+LABEL_power1="ps0_input_power"
+WARNHI_power1="2350000000"
+WARNLO_power1="0"
+CRITHI_power1="2500000000"
+CRITLO_power1="0"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/pwm-tacho-controller@1e786000.conf b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/pwm-tacho-controller@1e786000.conf
new file mode 100644
index 000000000..cfa98a3c8
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon%/obmc/hwmon/ahb/apb/pwm-tacho-controller@1e786000.conf
@@ -0,0 +1 @@
+LABEL_fan15 = "fan6"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/70-hwmon.rules b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/70-hwmon.rules
new file mode 100644
index 000000000..070d88f51
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/70-hwmon.rules
@@ -0,0 +1 @@
+SUBSYSTEM=="hwmon", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="xyz.openbmc_project.Hwmon@%E{OF_FULLNAME}.service"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/70-iio.rules b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/70-iio.rules
new file mode 100644
index 000000000..f332d11ac
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/70-iio.rules
@@ -0,0 +1 @@
+SUBSYSTEM=="iio", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}+="xyz.openbmc_project.Hwmon@%E{OF_FULLNAME}.service"
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/phosphor-max31785-msl@.service b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/phosphor-max31785-msl@.service
new file mode 100644
index 000000000..d9de6c081
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/phosphor-max31785-msl@.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Phosphor MAX31785 MSL
+ConditionFileNotEmpty={envfiledir}/obmc/hwmon-max31785/%I.conf
+Wants=mapper-wait@-xyz-openbmc_project-inventory.service
+After=mapper-wait@-xyz-openbmc_project-inventory.service
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/env max31785-msl -p "${{PATHS}}" -b ${{BUS}} -r ${{REVISION}}
+EnvironmentFile={envfiledir}/obmc/hwmon-max31785/%I.conf
+SyslogIdentifier=max31785-msl
diff --git a/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/xyz.openbmc_project.Hwmon@.service b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/xyz.openbmc_project.Hwmon@.service
new file mode 100644
index 000000000..8dca3ad4b
--- /dev/null
+++ b/meta-openbmc-machines/meta-openpower/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/xyz.openbmc_project.Hwmon@.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Phosphor Hwmon Poller
+ConditionFileNotEmpty=/etc/default/obmc/hwmon/%I.conf
+StopWhenUnneeded=true
+After=xyz.openbmc_project.ObjectMapper.service
+
+[Service]
+Restart=always
+ExecStart=/usr/bin/env phosphor-hwmon-readd -o %f
+SyslogIdentifier=phosphor-hwmon-readd
+EnvironmentFile=/etc/default/obmc/hwmon/%I.conf
OpenPOWER on IntegriCloud