summaryrefslogtreecommitdiffstats
path: root/meta-ibm/meta-witherspoon/recipes-phosphor/fans
diff options
context:
space:
mode:
Diffstat (limited to 'meta-ibm/meta-witherspoon/recipes-phosphor/fans')
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%.bbappend33
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-conflicts.conf2
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-monitor.conf5
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/obmc/phosphor-fan/phosphor-cooling-type-0.conf6
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/phosphor-cooling-type@.service15
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend1
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml766
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-fan-config%.bbappend1
-rwxr-xr-xmeta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-fan-config%/fans.yaml21
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native.bbappend1
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native/zone_conditions.yaml18
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-config-native.bbappend2
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml32
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-monitor-config-native.bbappend1
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-monitor-config-native/monitor.yaml73
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-presence-config-native%.bbappend1
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-presence-config-native%/config.yaml55
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy-native.bb16
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/air-cooled.yaml328
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/fan-errors.yaml676
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/water-cooled.yaml322
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog.bb22
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/obmc/witherspoon-fan-watchdog/fan-watchdog.conf3
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/obmc/witherspoon-fan-watchdog/reset-fan-watchdog.conf4
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-fan-watchdog-monitor@.service10
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-fan-watchdog.service13
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-reset-fan-watchdog.service12
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-thermal-policy-native.bb12
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-thermal-policy/thermal-policy.yaml187
29 files changed, 2638 insertions, 0 deletions
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%.bbappend b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%.bbappend
new file mode 100644
index 000000000..8cc310e7c
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/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 += "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 += "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-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-conflicts.conf b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-conflicts.conf
new file mode 100644
index 000000000..90b1e810e
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-conflicts.conf
@@ -0,0 +1,2 @@
+[Unit]
+Conflicts=obmc-fan-watchdog-takeover.target
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-monitor.conf b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/fan-watchdog-monitor.conf
new file mode 100644
index 000000000..023e61a64
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/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=witherspoon-fan-watchdog-monitor@%n.service
+StartLimitIntervalSec=5
+StartLimitBurst=3
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/obmc/phosphor-fan/phosphor-cooling-type-0.conf b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/obmc/phosphor-fan/phosphor-cooling-type-0.conf
new file mode 100644
index 000000000..e5e8f435e
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/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="--dev=/dev/input/by-path/platform-gpio-keys-event"
+CODE="--event=13"
+
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/phosphor-cooling-type@.service b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/phosphor-cooling-type@.service
new file mode 100644
index 000000000..9086efb77
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan%/phosphor-cooling-type@.service
@@ -0,0 +1,15 @@
+[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]
+Type=oneshot
+RemainAfterExit=yes
+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-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend
new file mode 100644
index 000000000..72d991c7e
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml
new file mode 100644
index 000000000..106202344
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml
@@ -0,0 +1,766 @@
+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/fan0
+ - /system/chassis/motherboard/fan1
+ - /system/chassis/motherboard/fan2
+ - /system/chassis/motherboard/fan3
+ - 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/fan0
+ - /system/chassis/motherboard/fan2
+ - /system/chassis/motherboard/fan3
+ - name: zone0_ambient
+ description: Group of ambient temperature sensors for zone 0
+ 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
+ - /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
+ - /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
+ - /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:
+ name: objectSignal
+ parameters:
+ - object
+ - interface
+ handler: removeInterface
+ - 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
+ - name: removeInterface
+ description: >
+ Removes an interface(and all associated properties) on the
+ given object from use within actions
+ parameters:
+ - object
+ - interface
+
+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: default_fan_floor_on_service_fail
+ # No global zone conditions defined == all unless defined on group
+ groups:
+ - name: zone0_ambient
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: nameOwnerChanged
+ actions:
+ - name: call_actions_based_on_timer
+ timer:
+ delay: 5
+ type: oneshot
+ actions:
+ - name: default_floor_on_missing_owner
+ - name: high_speed_on_occ0_service_fail
+ # No global zone conditions defined == all unless defined on group
+ groups:
+ - name: occ0_object
+ interface: org.open_power.OCC.Status
+ property:
+ name: OccActive
+ type: bool
+ matches:
+ - name: nameOwnerChanged
+ actions:
+ - name: call_actions_based_on_timer
+ timer:
+ delay: 5
+ type: oneshot
+ actions:
+ - name: set_speed_on_missing_owner
+ speed:
+ value: 10500
+ type: uint64_t
+ - name: high_speed_on_occ1_service_fail
+ # No global zone conditions defined == all unless defined on group
+ groups:
+ - name: occ1_object
+ interface: org.open_power.OCC.Status
+ property:
+ name: OccActive
+ type: bool
+ matches:
+ - name: nameOwnerChanged
+ actions:
+ - name: call_actions_based_on_timer
+ timer:
+ delay: 5
+ type: oneshot
+ actions:
+ - name: set_speed_on_missing_owner
+ speed:
+ value: 10500
+ type: uint64_t
+ - name: missing_before_high_speed_air
+ groups:
+ - name: air_cooled_zone0_fans
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ interface: xyz.openbmc_project.Inventory.Item
+ property:
+ name: Present
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property:
+ value: false
+ type: bool
+ speed:
+ value: 10500
+ type: uint64_t
+ - name: fails_before_high_speed_air
+ groups:
+ - name: air_cooled_zone0_fans
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ property:
+ name: Functional
+ type: bool
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property:
+ value: false
+ type: bool
+ speed:
+ value: 10500
+ type: uint64_t
+ - name: missing_before_high_speed_water_and_air
+ groups:
+ - name: water_and_air_cooled_zone0_fans
+ zone_conditions:
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 0
+ interface: xyz.openbmc_project.Inventory.Item
+ property:
+ name: Present
+ type: bool
+ matches:
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property:
+ value: false
+ type: bool
+ speed:
+ value: 10500
+ type: uint64_t
+ - name: fails_before_high_speed_water_and_air
+ groups:
+ - name: water_and_air_cooled_zone0_fans
+ zone_conditions:
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 0
+ interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ property:
+ name: Functional
+ type: bool
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property:
+ value: false
+ type: bool
+ speed:
+ value: 10500
+ type: uint64_t
+ - name: set_air_cooled_speed_boundaries_based_on_ambient
+ groups:
+ - name: zone0_ambient
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ 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: 3500
+ - 32000: 4600
+ - 37000: 5200
+ - 40000: 5800
+ type: std::map<int64_t, uint64_t>
+ - name: set_ceiling_from_average_sensor_value
+ map:
+ value:
+ - 25000: 7200
+ - 27000: 10500
+ type: std::map<int64_t, uint64_t>
+ - name: set_water_cooled_speed_boundaries_based_on_ambient
+ groups:
+ - name: zone0_ambient
+ zone_conditions:
+ - name: water_and_air_cooled_chassis
+ zones:
+ - 0
+ 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: 3000
+ - 32000: 4300
+ - 37000: 5000
+ - 40000: 5800
+ type: std::map<int64_t, uint64_t>
+ - name: set_ceiling_from_average_sensor_value
+ map:
+ value:
+ - 25000: 7200
+ - 27000: 10500
+ type: std::map<int64_t, uint64_t>
+ - name: speed_changes_based_on_regulator_temps
+ # No global zone conditions defined == all unless defined on group
+ groups:
+ - name: 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:
+ value: 85000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 400
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property:
+ value: 82000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 40
+ type: uint64_t
+ timer:
+ interval: 5
+ - name: speed_changes_based_on_pcie_temps
+ # No global zone conditions defined == all unless defined on group
+ groups:
+ - name: 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:
+ value: 55000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 400
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property:
+ value: 52000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 40
+ 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: fails_before_high_speed_air
+ groups:
+ - name: zone0_cores
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ property:
+ name: Functional
+ type: bool
+ - name: zone0_dimms
+ interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ property:
+ name: Functional
+ type: bool
+ - name: zone0_gpu_cores
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ property:
+ name: Functional
+ type: bool
+ - name: zone0_gpu_memory
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+ property:
+ name: Functional
+ type: bool
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ actions:
+ - name: count_state_before_speed
+ count: 1
+ property:
+ value: false
+ type: bool
+ speed:
+ value: 10500
+ type: uint64_t
+ - name: speed_changes_based_on_core_temps
+ groups:
+ - name: zone0_cores
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ - name: interfacesRemoved
+ actions:
+ - name: set_net_increase_speed
+ property:
+ value: 73000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 400
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property:
+ value: 70000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 40
+ type: uint64_t
+ timer:
+ interval: 5
+ - name: speed_changes_based_on_dimm_temps
+ # No global zone conditions defined == all unless defined on group
+ groups:
+ - name: zone0_dimms
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ - name: interfacesRemoved
+ actions:
+ - name: set_net_increase_speed
+ property:
+ value: 64000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 200
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property:
+ value: 61000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 40
+ type: uint64_t
+ timer:
+ interval: 5
+ - name: speed_changes_based_on_gpu_core_temps
+ groups:
+ - name: zone0_gpu_cores
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ - name: interfacesRemoved
+ actions:
+ - name: set_net_increase_speed
+ property:
+ value: 78000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 600
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property:
+ value: 75000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 40
+ type: uint64_t
+ timer:
+ interval: 5
+ - name: speed_changes_based_on_gpu_memory_temps
+ groups:
+ - name: zone0_gpu_memory
+ zone_conditions:
+ - name: air_cooled_chassis
+ zones:
+ - 0
+ interface: xyz.openbmc_project.Sensor.Value
+ property:
+ name: Value
+ type: int64_t
+ matches:
+ - name: interfacesAdded
+ - name: propertiesChanged
+ - name: interfacesRemoved
+ actions:
+ - name: set_net_increase_speed
+ property:
+ value: 80000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 600
+ type: uint64_t
+ - name: set_net_decrease_speed
+ property:
+ value: 77000
+ type: int64_t
+ factor:
+ value: 1000
+ type: int64_t
+ delta:
+ value: 40
+ type: uint64_t
+ timer:
+ interval: 5
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-fan-config%.bbappend b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-fan-config%.bbappend
new file mode 100644
index 000000000..72d991c7e
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-fan-config%.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-fan-config%/fans.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-fan-config%/fans.yaml
new file mode 100755
index 000000000..a70ac85a3
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-fan-config%/fans.yaml
@@ -0,0 +1,21 @@
+fans:
+ - inventory: /system/chassis/motherboard/fan2
+ cooling_zone: 0
+ cooling_profile: all
+ sensors:
+ - fan2_0
+ - inventory: /system/chassis/motherboard/fan0
+ cooling_zone: 0
+ cooling_profile: all
+ sensors:
+ - fan0_0
+ - inventory: /system/chassis/motherboard/fan1
+ cooling_zone: 0
+ cooling_profile: air
+ sensors:
+ - fan1_0
+ - inventory: /system/chassis/motherboard/fan3
+ cooling_zone: 0
+ cooling_profile: all
+ sensors:
+ - fan3_0
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native.bbappend b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native.bbappend
new file mode 100644
index 000000000..72d991c7e
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native/zone_conditions.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config-native/zone_conditions.yaml
new file mode 100644
index 000000000..0c8b3c5ff
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/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-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-config-native.bbappend b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-config-native.bbappend
new file mode 100644
index 000000000..6d4804d12
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-config-native.bbappend
@@ -0,0 +1,2 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
+
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml
new file mode 100644
index 000000000..29dd2c79e
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml
@@ -0,0 +1,32 @@
+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: 10500
+ default_floor: 8000
+ increase_delay: 5
+ decrease_interval: 30
+
+#Water cooled zones
+- zone_conditions:
+ - name: water_and_air_cooled_chassis
+
+ zones:
+ - zone: 0
+ cooling_profiles:
+ - water
+ - all
+ full_speed: 10500
+ default_floor: 8000
+ increase_delay: 5
+ decrease_interval: 30
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-monitor-config-native.bbappend b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-monitor-config-native.bbappend
new file mode 100644
index 000000000..72d991c7e
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-monitor-config-native.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-monitor-config-native/monitor.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-monitor-config-native/monitor.yaml
new file mode 100644
index 000000000..5db7966fa
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-monitor-config-native/monitor.yaml
@@ -0,0 +1,73 @@
+fans:
+ - inventory: /system/chassis/motherboard/fan0
+ functional_delay: 5
+ allowed_out_of_range_time: 30
+ deviation: 15
+ num_sensors_nonfunc_for_fan_nonfunc: 1
+ sensors:
+ - name: fan0_0
+ has_target: true
+ - name: fan0_1
+ has_target: false
+
+ - inventory: /system/chassis/motherboard/fan1
+ functional_delay: 5
+ allowed_out_of_range_time: 30
+ deviation: 15
+ num_sensors_nonfunc_for_fan_nonfunc: 1
+ sensors:
+ - name: fan1_0
+ has_target: true
+ - name: fan1_1
+ has_target: false
+ # Create fan1 inventory & sensors on air cooled only
+ condition:
+ name: propertiesMatch
+ properties:
+ - object: /xyz/openbmc_project/inventory/system/chassis
+ interface: xyz.openbmc_project.Inventory.Decorator.CoolingType
+ property:
+ name: WaterCooled
+ type: bool
+ value: false
+
+ - inventory: /system/chassis/motherboard/fan2
+ functional_delay: 5
+ allowed_out_of_range_time: 30
+ deviation: 15
+ num_sensors_nonfunc_for_fan_nonfunc: 1
+ sensors:
+ - name: fan2_0
+ has_target: true
+ - name: fan2_1
+ has_target: false
+
+ - inventory: /system/chassis/motherboard/fan3
+ functional_delay: 5
+ allowed_out_of_range_time: 30
+ deviation: 15
+ num_sensors_nonfunc_for_fan_nonfunc: 1
+ sensors:
+ - name: fan3_0
+ has_target: true
+ - name: fan3_1
+ has_target: false
+
+sensor_trust_groups:
+ - class: NonzeroSpeed
+ group:
+ # Include all _1 fans to determine trust
+ - name: fan0_1
+ - name: fan1_1
+ - name: fan2_1
+ - name: fan3_1
+ # Add all _0 fans to be included in trust result effects,
+ # but not in determining trust
+ - name: fan0_0
+ in_trust: false
+ - name: fan1_0
+ in_trust: false
+ - name: fan2_0
+ in_trust: false
+ - name: fan3_0
+ in_trust: false
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-presence-config-native%.bbappend b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-presence-config-native%.bbappend
new file mode 100644
index 000000000..72d991c7e
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-presence-config-native%.bbappend
@@ -0,0 +1 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-presence-config-native%/config.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-presence-config-native%/config.yaml
new file mode 100644
index 000000000..c5be29c1e
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-presence-config-native%/config.yaml
@@ -0,0 +1,55 @@
+- name: fan0
+ path: /system/chassis/motherboard/fan0
+ methods:
+ - type: gpio
+ key: 4
+ physpath: /sys/devices/platform/ahb/ahb:apb/ahb:apb:i2c@1e78a000/1e78a100.i2c-bus/i2c-3/3-0060
+ devpath: /dev/input/by-path/platform-gpio-keys-polled-event
+ - type: tach
+ sensors:
+ - fan0_0
+ - fan0_1
+ rpolicy:
+ type: anyof
+
+- name: fan1
+ path: /system/chassis/motherboard/fan1
+ methods:
+ - type: gpio
+ key: 5
+ physpath: /sys/devices/platform/ahb/ahb:apb/ahb:apb:i2c@1e78a000/1e78a100.i2c-bus/i2c-3/3-0060
+ devpath: /dev/input/by-path/platform-gpio-keys-polled-event
+ - type: tach
+ sensors:
+ - fan1_0
+ - fan1_1
+ rpolicy:
+ type: anyof
+
+- name: fan2
+ path: /system/chassis/motherboard/fan2
+ methods:
+ - type: gpio
+ key: 6
+ physpath: /sys/devices/platform/ahb/ahb:apb/ahb:apb:i2c@1e78a000/1e78a100.i2c-bus/i2c-3/3-0060
+ devpath: /dev/input/by-path/platform-gpio-keys-polled-event
+ - type: tach
+ sensors:
+ - fan2_0
+ - fan2_1
+ rpolicy:
+ type: anyof
+
+- name: fan3
+ path: /system/chassis/motherboard/fan3
+ methods:
+ - type: gpio
+ key: 7
+ physpath: /sys/devices/platform/ahb/ahb:apb/ahb:apb:i2c@1e78a000/1e78a100.i2c-bus/i2c-3/3-0060
+ devpath: /dev/input/by-path/platform-gpio-keys-polled-event
+ - type: tach
+ sensors:
+ - fan3_0
+ - fan3_1
+ rpolicy:
+ type: anyof
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy-native.bb b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy-native.bb
new file mode 100644
index 000000000..b7da45c01
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy-native.bb
@@ -0,0 +1,16 @@
+SUMMARY = "Fan policy for Witherspoon"
+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-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/air-cooled.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/air-cooled.yaml
new file mode 100644
index 000000000..d60aa9179
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/air-cooled.yaml
@@ -0,0 +1,328 @@
+# Air cooled Witherspoon fan policy for PDM.
+#
+# An air cooled Witherspoon requires a minimum of three functional fans
+# enclosures or six functional fan rotors across all enclosures.
+# If the number of functional fan enclosures is below three, soft poweroff
+# the system, whereas if the number of fan rotors drop below six, an
+# immediate hard poweroff of the system occurs.
+
+- name: fan enclosures
+ description: >
+ 'An air cooled Witherspoon has four fan enclosures 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
+
+- name: fan rotors
+ description: >
+ 'An air cooled Witherspoon has eight fan rotors to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0/fan0_0
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0/fan0_1
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1/fan1_0
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1/fan1_1
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2/fan2_0
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2/fan2_1
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3/fan3_0
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3/fan3_1
+
+- name: chassis state
+ description: >
+ 'Witherspoon has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSISSTATE
+ path: /xyz/openbmc_project/state/chassis0
+
+- name: chassis
+ description: >
+ 'Witherspoon 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 enclosure presence state changes.'
+ class: watch
+ watch: property
+ paths: fan enclosures
+ properties: fan present
+ callback: check cooling type
+
+- name: watch fan functional
+ description: >
+ 'Trigger logic on fan enclosure functional state changes.'
+ class: watch
+ watch: property
+ paths: fan enclosures
+ properties: fan functional
+ callback: check cooling type
+
+- name: watch fan rotor functional
+ description: >
+ 'Trigger logic on fan rotor functional state changes.'
+ class: watch
+ watch: property
+ paths: fan rotors
+ 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 fan enclosures and at least
+ six functional fan rotors, power off if not.'
+ class: callback
+ callback: group
+ members:
+ - check group presence
+ - check group functional enclosures
+ - check group functional rotors
+
+- 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: fan enclosures
+ properties: fan present
+ defer: 25000000us
+ callback: log and shutdown
+ countop: '<'
+ countbound: 3
+ op: '=='
+ bound: true
+
+- name: check group functional enclosures
+ description: >
+ 'If this condition passes more than one fan enclosure 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: fan enclosures
+ properties: fan functional
+ defer: 5000000us
+ callback: log and shutdown
+ countop: '>'
+ countbound: 1
+ op: '=='
+ bound: false
+
+- name: check group functional rotors
+ description: >
+ 'If this condition passes more than two fan rotors in the group have been
+ marked as nonfunctional for five seconds. Immediately power off.
+
+ 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: fan rotors
+ properties: fan functional
+ defer: 5000000us
+ callback: log and poweroff
+ countop: '>'
+ countbound: 2
+ op: '=='
+ bound: false
+
+- name: log and poweroff
+ description: >
+ 'Immediately poweroff, log an event in the journal, and create an
+ error log.'
+ class: callback
+ callback: group
+ members:
+ - hard poweroff
+ - log hard poweroff
+ - create shutdown error
+
+- 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 shutdown
+ - create shutdown error
+
+- name: hard poweroff
+ description: >
+ 'Immediately power off 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: 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-host-shutdown@0.target
+ type: string
+ - value: replace
+ type: string
+
+- name: log hard poweroff
+ description: >
+ 'Log a hard poweroff event to the systemd journal.'
+ class: callback
+ callback: journal
+ paths: chassis state
+ properties: chassis powered
+ severity: ERR
+ message: Immediate poweroff of system. There are not enough functional fans.
+
+- name: log shutdown
+ description: >
+ 'Log a shutdown event to the systemd journal.'
+ class: callback
+ callback: journal
+ paths: chassis state
+ properties: chassis powered
+ severity: ERR
+ message: Request shutdown of 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-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/fan-errors.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/fan-errors.yaml
new file mode 100644
index 000000000..0c14627d2
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/fan-errors.yaml
@@ -0,0 +1,676 @@
+# Witherspoon fan error policy for PDM.
+#
+# * Create a NotPresent error if fan 0, 1, 2, or 3 is not present for more
+# than 20 seconds.
+# * Create a Nonfunctional error if fan 0, 1, 2, or 3 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 fan 1.
+# Note: An error is created each time the chassis powers on.
+#
+# * Watch for fans to become both present and 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: chassis state
+ description: >
+ 'Witherspoon has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSISSTATE
+ path: /xyz/openbmc_project/state/chassis0
+
+- name: chassis
+ description: >
+ 'Witherspoon 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: fan present and functional
+ description: >
+ 'Monitor the present and functional state of each fan.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.Inventory.Item
+ meta: PRESENT
+ property: Present
+ - 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 fan0 present and functional for resolving error logs
+ description: >
+ 'On fan present or functional state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: fan0
+ properties: fan present and functional
+ callback: resolve fan0 errors if present and functional
+
+- name: watch fan1 present and functional for resolving error logs
+ description: >
+ 'On fan present or functional state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: fan1
+ properties: fan present and functional
+ callback: resolve fan1 errors if present and functional
+
+- name: watch fan2 present and functional for resolving error logs
+ description: >
+ 'On fan present or functional state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: fan2
+ properties: fan present and functional
+ callback: resolve fan2 errors if present and functional
+
+- name: watch fan3 present and functional for resolving error logs
+ description: >
+ 'On fan present or functional state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: fan3
+ properties: fan present and functional
+ callback: resolve fan3 errors if present and 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 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 fan0 functional
+ - check fan1 functional
+ - check fan2 functional
+ - check fan3 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 Witherspoon, 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 Witherspoon, 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.'
+ class: condition
+ condition: count
+ paths: fan2
+ properties: fan present
+ defer: 20000000us
+ callback: notpresent fan2 error
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check fan2 functional
+ description: >
+ 'If this condition passes fan2 has been marked as nonfunctional.'
+ class: condition
+ condition: count
+ paths: fan2
+ properties: fan functional
+ callback: nonfunctional fan2 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.'
+ class: condition
+ condition: count
+ paths: fan3
+ properties: fan present
+ defer: 20000000us
+ callback: notpresent fan3 error
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check fan3 functional
+ description: >
+ 'If this condition passes fan3 has been marked as nonfunctional.'
+ class: condition
+ condition: count
+ paths: fan3
+ properties: fan functional
+ callback: nonfunctional fan3 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 fan 1.'
+ 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 fan 1.'
+ 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: resolve fan0 errors if present and functional
+ description: >
+ 'If fan0 is present and functional, call the resolve fan0 errors callback.'
+ class: condition
+ condition: count
+ paths: fan0
+ properties: fan present and functional
+ callback: resolve fan0 errors
+ countop: '=='
+ countbound: 2
+ op: '=='
+ bound: true
+
+#Go ahead and do this on water cooled as well
+- name: resolve fan1 errors if present and functional
+ description: >
+ 'If fan1 is present and functional, call the resolve fan1 errors callback.'
+ class: condition
+ condition: count
+ paths: fan1
+ properties: fan present and functional
+ callback: resolve fan1 errors
+ countop: '=='
+ countbound: 2
+ op: '=='
+ bound: true
+
+- name: resolve fan2 errors if present and functional
+ description: >
+ 'If fan2 is present and functional, call the resolve fan2 errors callback.'
+ class: condition
+ condition: count
+ paths: fan2
+ properties: fan present and functional
+ callback: resolve fan2 errors
+ countop: '=='
+ countbound: 2
+ op: '=='
+ bound: true
+
+- name: resolve fan3 errors if present and functional
+ description: >
+ 'If fan3 is present and functional, call the resolve fan3 errors callback.'
+ class: condition
+ condition: count
+ paths: fan3
+ properties: fan present and functional
+ callback: resolve fan3 errors
+ countop: '=='
+ countbound: 2
+ op: '=='
+ bound: true
+
+- name: resolve fan0 errors
+ class: callback
+ callback: resolve callout
+ paths: fan0
+ properties: fan present and functional
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
+
+- name: resolve fan1 errors
+ class: callback
+ callback: resolve callout
+ paths: fan1
+ properties: fan present and functional
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1
+
+- name: resolve fan2 errors
+ class: callback
+ callback: resolve callout
+ paths: fan2
+ properties: fan present and functional
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
+
+- name: resolve fan3 errors
+ class: callback
+ callback: resolve callout
+ paths: fan3
+ properties: fan present and functional
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/water-cooled.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/water-cooled.yaml
new file mode 100644
index 000000000..a279cfefa
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/water-cooled.yaml
@@ -0,0 +1,322 @@
+# Water cooled Witherspoon fan policy for PDM.
+#
+# A water cooled Witherspoon requires a minimum of two functional fan
+# enclosures or four functional fan rotors across all enclosures.
+# If the number of functional fan enclosures is below two, soft poweroff
+# the system, whereas if the number of fan rotors drop below four, an
+# immediate hard poweroff of the system occurs.
+
+- name: fan enclosures
+ description: >
+ 'A water cooled Witherspoon has three fan enclosures 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/fan2
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
+
+- name: fan rotors
+ description: >
+ 'A water cooled Witherspoon has six fan rotors to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0/fan0_0
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0/fan0_1
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2/fan2_0
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2/fan2_1
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3/fan3_0
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3/fan3_1
+
+- name: chassis state
+ description: >
+ 'Witherspoon has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSISSTATE
+ path: /xyz/openbmc_project/state/chassis0
+
+- name: chassis
+ description: >
+ 'Witherspoon 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 enclosure presence state changes.'
+ class: watch
+ watch: property
+ paths: fan enclosures
+ properties: fan present
+ callback: check cooling type
+
+- name: watch fan functional
+ description: >
+ 'Trigger logic on fan enclosure functional state changes.'
+ class: watch
+ watch: property
+ paths: fan enclosures
+ properties: fan functional
+ callback: check cooling type
+
+- name: watch fan rotor functional
+ description: >
+ 'Trigger logic on fan rotor functional state changes.'
+ class: watch
+ watch: property
+ paths: fan rotors
+ 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 fan enclosures and at least
+ four functional fan rotors, power off if not.'
+ class: callback
+ callback: group
+ members:
+ - check group presence
+ - check group functional enclosures
+ - check group functional rotors
+
+- 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: fan enclosures
+ properties: fan present
+ defer: 25000000us
+ callback: log and shutdown
+ countop: '<'
+ countbound: 2
+ op: '=='
+ bound: true
+
+- name: check group functional enclosures
+ description: >
+ 'If this condition passes more than one fan enclosure 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: fan enclosures
+ properties: fan functional
+ defer: 5000000us
+ callback: log and shutdown
+ countop: '>'
+ countbound: 1
+ op: '=='
+ bound: false
+
+- name: check group functional rotors
+ description: >
+ 'If this condition passes more than two fan rotors in the group have been
+ marked as nonfunctional for five seconds. Immediately power off.
+
+ 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: fan rotors
+ properties: fan functional
+ defer: 5000000us
+ callback: log and poweroff
+ countop: '>'
+ countbound: 2
+ op: '=='
+ bound: false
+
+- name: log and poweroff
+ description: >
+ 'Immediately poweroff, log an event in the journal, and create an
+ error log.'
+ class: callback
+ callback: group
+ members:
+ - hard poweroff
+ - log hard poweroff
+ - create shutdown error
+
+- 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 shutdown
+ - create shutdown error
+
+- name: hard poweroff
+ description: >
+ 'Immediately power off 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: 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-host-shutdown@0.target
+ type: string
+ - value: replace
+ type: string
+
+- name: log hard poweroff
+ description: >
+ 'Log a hard poweroff event to the systemd journal.'
+ class: callback
+ callback: journal
+ paths: chassis state
+ properties: chassis powered
+ severity: ERR
+ message: Immediate poweroff of system. There are not enough functional fans.
+
+- name: log shutdown
+ description: >
+ 'Log a shutdown event to the systemd journal.'
+ class: callback
+ callback: journal
+ paths: chassis state
+ properties: chassis powered
+ severity: ERR
+ message: Request shutdown of 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-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog.bb b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog.bb
new file mode 100644
index 000000000..c09b9df24
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog.bb
@@ -0,0 +1,22 @@
+SUMMARY = "Witherspoon fan watchdog services"
+PR = "r1"
+
+inherit obmc-phosphor-license
+inherit obmc-phosphor-systemd
+
+RDEPENDS_${PN} += "virtual/obmc-gpio-monitor"
+RDEPENDS_${PN} += "busybox"
+
+RESET_SERVICE = "witherspoon-reset-fan-watchdog.service"
+TGTFMT = "obmc-chassis-poweron@0.target"
+RESET_FMT = "../${RESET_SERVICE}:${TGTFMT}.requires/${RESET_SERVICE}"
+
+MONITOR_SERVICE = "witherspoon-fan-watchdog-monitor@.service"
+
+WATCHDOG_SERVICE = "witherspoon-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/witherspoon-fan-watchdog/reset-fan-watchdog.conf"
+SYSTEMD_ENVIRONMENT_FILE_${PN} += "obmc/witherspoon-fan-watchdog/fan-watchdog.conf"
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/obmc/witherspoon-fan-watchdog/fan-watchdog.conf b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/obmc/witherspoon-fan-watchdog/fan-watchdog.conf
new file mode 100644
index 000000000..ce7824ccb
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/obmc/witherspoon-fan-watchdog/fan-watchdog.conf
@@ -0,0 +1,3 @@
+TIMEOUT=5
+INTERVAL=1
+DEVICE=/dev/watchdog0
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/obmc/witherspoon-fan-watchdog/reset-fan-watchdog.conf b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/obmc/witherspoon-fan-watchdog/reset-fan-watchdog.conf
new file mode 100644
index 000000000..b4e5ce74e
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/obmc/witherspoon-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-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-fan-watchdog-monitor@.service b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-fan-watchdog-monitor@.service
new file mode 100644
index 000000000..945561b50
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-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-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-fan-watchdog.service b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-fan-watchdog.service
new file mode 100644
index 000000000..5b59546e3
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-fan-watchdog.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Witherspoon 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/witherspoon-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-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-reset-fan-watchdog.service b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-reset-fan-watchdog.service
new file mode 100644
index 000000000..e0ef0aeeb
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-watchdog/witherspoon-reset-fan-watchdog.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Witherspoon 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/witherspoon-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-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-thermal-policy-native.bb b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-thermal-policy-native.bb
new file mode 100644
index 000000000..39831cf86
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-thermal-policy-native.bb
@@ -0,0 +1,12 @@
+SUMMARY = "Thermal policy for Witherspoon"
+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-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-thermal-policy/thermal-policy.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-thermal-policy/thermal-policy.yaml
new file mode 100644
index 000000000..1dd2306e9
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/witherspoon-thermal-policy/thermal-policy.yaml
@@ -0,0 +1,187 @@
+# Witherspoon thermal policy for PDM.
+#
+# Shut down a Witherspoon system if more than three POWER9 cores
+# have a temperature greater than 115 degrees Celcius.
+
+
+- name: core sensors
+ description: >
+ 'Witherspoon has two POWER9 chips with 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
+ oneshot: true
+
+- name: log and shutdown
+ description: >
+ 'Shut the system down and log an event.'
+ class: callback
+ callback: group
+ members:
+ - shutdown
+ - 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: create criticalhigh error
+ description: >
+ 'Create a CriticalHigh Error log.'
+ class: callback
+ callback: elog_with_metadata
+ paths: core sensors
+ properties: core temp
+ error: xyz::openbmc_project::Sensor::Threshold::Error::CriticalHigh
+ metadata: xyz::openbmc_project::Sensor::Threshold::CriticalHigh::SENSOR_DATA
+
+- 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
OpenPOWER on IntegriCloud