summaryrefslogtreecommitdiff
path: root/meta-ibm/meta-witherspoon/recipes-phosphor/dbus
diff options
context:
space:
mode:
authorMatthew Barth <msbarth@us.ibm.com>2019-06-12 21:01:04 +0300
committerBrad Bishop <bradleyb@fuzziesquirrel.com>2019-06-27 23:22:43 +0300
commitf14cc1b38d12e658dbbb4102452e11a1de9ab6d6 (patch)
treeec780c7957466b07da686eeb63d48f41669439f6 /meta-ibm/meta-witherspoon/recipes-phosphor/dbus
parentee6efccdcb19807a141c5c2d93c3f6bfe8f8fc4c (diff)
downloadopenbmc-f14cc1b38d12e658dbbb4102452e11a1de9ab6d6.tar.xz
Put dbus monitor policies in one place
To better organize the policies(and the configurations) that are used by phosphor-dbus-monitor, all of them are now located under the `dbus` directory. This moves toward a more understandable and centralized scheme for the recipe(s) used to configure and build phosphor-dbus-monitor. (From meta-ibm rev: 4b80c4f2b3a62d8084fc43f95177e299d53387ae) Change-Id: Ie99c5dbe55c2295fc5cd7b5e7722cc10064e1b71 Signed-off-by: Matthew Barth <msbarth@us.ibm.com> Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Diffstat (limited to 'meta-ibm/meta-witherspoon/recipes-phosphor/dbus')
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/events-policy.bb17
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/events-policy/config.yaml133
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy.bb23
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/swift/air-cooled.yaml274
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/swift/fan-errors.yaml671
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/swift/water-cooled.yaml274
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/witherspoon/air-cooled.yaml328
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/witherspoon/fan-errors.yaml676
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/witherspoon/water-cooled.yaml322
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/power-supply-policy.bb17
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/power-supply-policy/power-supply-policy.yaml215
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/thermal-policy.bb17
-rw-r--r--meta-ibm/meta-witherspoon/recipes-phosphor/dbus/thermal-policy/thermal-policy.yaml187
13 files changed, 3154 insertions, 0 deletions
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/events-policy.bb b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/events-policy.bb
new file mode 100644
index 000000000..f456e4287
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/events-policy.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Event policy configuration for meta-witherspoon machines"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${IBMBASE}/COPYING.apache-2.0;md5=34400b68072d710fecd0a2940a0d1658"
+
+inherit allarch
+inherit phosphor-dbus-monitor
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
+
+SRC_URI += "file://config.yaml"
+
+do_install() {
+ install -D ${WORKDIR}/config.yaml ${D}${config_dir}/config.yaml
+}
+
+FILES_${PN} += "${config_dir}/config.yaml"
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/events-policy/config.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/events-policy/config.yaml
new file mode 100644
index 000000000..5c62d45a3
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/events-policy/config.yaml
@@ -0,0 +1,133 @@
+- name: occpath group
+ class: group
+ group: path
+ members:
+ - meta: PATH
+ path: /org/open_power/control/occ0
+
+- name: occproctemp property
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: org.open_power.OCC.Status
+ meta: PROPERTY
+ property: ThrottleProcTemp
+
+- name: occprocpower property
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: org.open_power.OCC.Status
+ meta: PROPERTY
+ property: ThrottleProcPower
+
+- name: occmemtemp property
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: org.open_power.OCC.Status
+ meta: PROPERTY
+ property: ThrottleMemTemp
+
+- name: watch occproctemp
+ class: watch
+ watch: property
+ paths: occpath group
+ properties: occproctemp property
+ callback: check occproctemp
+
+- name: watch occprocpower
+ class: watch
+ watch: property
+ paths: occpath group
+ properties: occprocpower property
+ callback: check occprocpower
+
+- name: watch occmemtemp
+ class: watch
+ watch: property
+ paths: occpath group
+ properties: occmemtemp property
+ callback: check occmemtemp
+
+- name: check occproctemp
+ class: condition
+ condition: count
+ paths: occpath group
+ properties: occproctemp property
+ defer: 1000us
+ callback: create occproctemp event
+ countop: '=='
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check occprocpower
+ class: condition
+ condition: count
+ paths: occpath group
+ properties: occprocpower property
+ defer: 1000us
+ callback: create occprocpower event
+ countop: '=='
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check occmemtemp
+ class: condition
+ condition: count
+ paths: occpath group
+ properties: occmemtemp property
+ defer: 1000us
+ callback: create occmemtemp event
+ countop: '=='
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: create occproctemp event
+ class: callback
+ callback: event
+ paths: occpath group
+ properties: occproctemp property
+ eventName: occ
+ eventMessage: "Processor throttled due to an over temperature condition."
+
+- name: create occprocpower event
+ class: callback
+ callback: event
+ paths: occpath group
+ properties: occprocpower property
+ eventName: occ
+ eventMessage: "Processor throttled due to reaching the power cap limit."
+
+- name: create occmemtemp event
+ class: callback
+ callback: event
+ paths: occpath group
+ properties: occmemtemp property
+ eventName: occ
+ eventMessage: "Memory throttled due to an over temperature condition."
+
+- name: errorlog path group
+ class: group
+ group: path
+ members:
+ - meta: PATH
+ path: /xyz/openbmc_project/logging
+
+- name: pathwatch errorlog
+ class: pathwatch
+ pathwatch: path
+ paths: errorlog path group
+ pathcallback: create errorlog trap
+
+- name: create errorlog trap
+ class: pathcallback
+ pathcallback: eventpath
+ paths: errorlog path group
+ eventType: ErrorTrap
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy.bb b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy.bb
new file mode 100644
index 000000000..12194640d
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy.bb
@@ -0,0 +1,23 @@
+SUMMARY = "Fan policy configurations for meta-witherspoon machines"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${IBMBASE}/COPYING.apache-2.0;md5=34400b68072d710fecd0a2940a0d1658"
+
+inherit allarch
+inherit phosphor-dbus-monitor
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
+
+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
+}
+
+FILES_${PN} += "${config_dir}/air-cooled.yaml"
+FILES_${PN} += "${config_dir}/water-cooled.yaml"
+FILES_${PN} += "${config_dir}/fan-errors.yaml"
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/swift/air-cooled.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/swift/air-cooled.yaml
new file mode 100644
index 000000000..bfdcd1bb6
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/swift/air-cooled.yaml
@@ -0,0 +1,274 @@
+# Air cooled Swift fan policy for PDM.
+#
+# An air cooled Swift requires a minimum of three functional fan enclosures.
+# If the number of functional fan enclosures is below three, soft poweroff
+# the system.
+
+- name: fan enclosures
+ description: >
+ 'An air cooled Swift 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: chassis state
+ description: >
+ 'Swift has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSISSTATE
+ path: /xyz/openbmc_project/state/chassis0
+
+- name: chassis
+ description: >
+ 'Swift 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 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,
+ power off if not.'
+ class: callback
+ callback: group
+ members:
+ - check group presence
+ - check group functional enclosures
+
+- 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: 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/dbus/fan-policy/swift/fan-errors.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/swift/fan-errors.yaml
new file mode 100644
index 000000000..794d91f17
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/swift/fan-errors.yaml
@@ -0,0 +1,671 @@
+# Swift 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.
+# 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: >
+ 'Swift has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSISSTATE
+ path: /xyz/openbmc_project/state/chassis0
+
+- name: chassis
+ description: >
+ 'Swift 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.'
+ class: condition
+ condition: count
+ paths: fan1
+ properties: fan present
+ defer: 20000000us
+ callback: notpresent fan1 error
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check fan1 functional
+ description: >
+ 'If this condition passes fan1 has been marked as nonfunctional.'
+ class: condition
+ condition: count
+ paths: fan1
+ properties: fan functional
+ callback: nonfunctional fan1 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/dbus/fan-policy/swift/water-cooled.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/swift/water-cooled.yaml
new file mode 100644
index 000000000..661021a9b
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/swift/water-cooled.yaml
@@ -0,0 +1,274 @@
+# Water cooled Swift fan policy for PDM.
+#
+# A water cooled Swift requires a minimum of three functional fan
+# enclosures. If the number of functional fan enclosures is below three,
+# soft poweroff the system.
+
+- name: fan enclosures
+ description: >
+ 'A water cooled Swift 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: chassis state
+ description: >
+ 'Swift has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSISSTATE
+ path: /xyz/openbmc_project/state/chassis0
+
+- name: chassis
+ description: >
+ 'Swift 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 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 three functional fan enclosures,
+ power off if not.'
+ class: callback
+ callback: group
+ members:
+ - check group presence
+ - check group functional enclosures
+
+- 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: 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/dbus/fan-policy/witherspoon/air-cooled.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/witherspoon/air-cooled.yaml
new file mode 100644
index 000000000..d60aa9179
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/witherspoon/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/dbus/fan-policy/witherspoon/fan-errors.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/witherspoon/fan-errors.yaml
new file mode 100644
index 000000000..0c14627d2
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/witherspoon/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/dbus/fan-policy/witherspoon/water-cooled.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/witherspoon/water-cooled.yaml
new file mode 100644
index 000000000..a279cfefa
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/fan-policy/witherspoon/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/dbus/power-supply-policy.bb b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/power-supply-policy.bb
new file mode 100644
index 000000000..27d60fb34
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/power-supply-policy.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Power supply policy configuration for meta-witherspoon machines"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${IBMBASE}/COPYING.apache-2.0;md5=34400b68072d710fecd0a2940a0d1658"
+
+inherit allarch
+inherit phosphor-dbus-monitor
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
+
+SRC_URI += "file://power-supply-policy.yaml"
+
+do_install() {
+ install -D ${WORKDIR}/power-supply-policy.yaml ${D}${config_dir}/power-supply-policy.yaml
+}
+
+FILES_${PN} += "${config_dir}/power-supply-policy.yaml"
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/power-supply-policy/power-supply-policy.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/power-supply-policy/power-supply-policy.yaml
new file mode 100644
index 000000000..e00e747b6
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/power-supply-policy/power-supply-policy.yaml
@@ -0,0 +1,215 @@
+# Machine power supply policy for PDM.
+#
+# Create an error if a power supply is removed while the system is powered on
+
+- name: power supply0
+ class: group
+ group: path
+ members:
+ - meta: POWER SUPPLY
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0
+
+- name: power supply1
+ class: group
+ group: path
+ members:
+ - meta: POWER SUPPLY
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1
+
+- name: power supplies
+ description: >
+ 'The machine has two power supplies to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: POWER SUPPLY
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0
+ - meta: POWER SUPPLY
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1
+
+- name: chassis state
+ description: >
+ 'The machine has a single chassis to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: CHASSISSTATE
+ path: /xyz/openbmc_project/state/chassis0
+
+- name: power supply present
+ description: >
+ 'Monitor the presence state of each power supply.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.Inventory.Item
+ meta: PRESENT
+ property: Present
+
+- 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: watch power supply present
+ description: >
+ 'Trigger logic on power supply presence state changes.'
+ class: watch
+ watch: property
+ paths: power supplies
+ properties: power supply present
+ callback: check power
+
+- 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: check power
+ description: >
+ 'If the chassis has power, check for power supplies.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: check power supplies
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power supplies
+ description: >
+ 'Create an error if a power supply is not present.'
+ class: callback
+ callback: group
+ members:
+ - check power supply0 presence
+ - check power supply1 presence
+
+- name: check power supply0 presence
+ description: >
+ 'If this condition passes power supply0 has been unplugged for more than
+ 5 seconds. Count present power supplies rather than non-present
+ power supplies since the latter would pass if the power supply 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 power supply inventory object implementation.'
+ class: condition
+ condition: count
+ paths: power supply0
+ properties: power supply present
+ defer: 5000000us
+ callback: notpresent power supply0 error
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check power supply1 presence
+ description: >
+ 'If this condition passes power supply1 has been unplugged for more than
+ 5 seconds.'
+ class: condition
+ condition: count
+ paths: power supply1
+ properties: power supply present
+ defer: 5000000us
+ callback: notpresent power supply1 error
+ countop: '<'
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: notpresent power supply0 error
+ class: callback
+ callback: elog
+ paths: power supply0
+ properties: power supply 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/powersupply0
+ type: string
+
+- name: notpresent power supply1 error
+ class: callback
+ callback: elog
+ paths: power supply1
+ properties: power supply 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/powersupply1
+ type: string
+
+- name: resolve power supply0 errors if present
+ description: >
+ 'If power supply0 is present, call the resolve ps0 errors callback.'
+ class: condition
+ condition: count
+ paths: power supply0
+ properties: power supply present
+ callback: resolve power supply0 errors
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: true
+
+- name: resolve power supply1 errors if present
+ description: >
+ 'If power supply1 is present, call the resolve ps1 errors callback.'
+ class: condition
+ condition: count
+ paths: power supply1
+ properties: power supply present
+ callback: resolve power supply1 errors
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: true
+
+- name: resolve power supply0 errors
+ class: callback
+ callback: resolve callout
+ paths: power supply0
+ properties: power supply present
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0
+
+- name: resolve power supply1 errors
+ class: callback
+ callback: resolve callout
+ paths: power supply1
+ properties: power supply present
+ callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1
+
+- name: watch power supply0 present for resolving error logs
+ description: >
+ 'On supply present state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: power supply0
+ properties: power supply present
+ callback: resolve power supply0 errors if present
+
+- name: watch power supply1 present for resolving error logs
+ description: >
+ 'On supply present state changes, check if errors need to be resolved.'
+ class: watch
+ watch: property
+ paths: power supply1
+ properties: power supply present
+ callback: resolve power supply1 errors if present
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/thermal-policy.bb b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/thermal-policy.bb
new file mode 100644
index 000000000..9fb7d252b
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/thermal-policy.bb
@@ -0,0 +1,17 @@
+SUMMARY = "Thermal policy configuration for meta-witherspoon machines"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${IBMBASE}/COPYING.apache-2.0;md5=34400b68072d710fecd0a2940a0d1658"
+
+inherit allarch
+inherit phosphor-dbus-monitor
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
+
+SRC_URI += "file://thermal-policy.yaml"
+
+do_install() {
+ install -D ${WORKDIR}/thermal-policy.yaml ${D}${config_dir}/thermal-policy.yaml
+}
+
+FILES_${PN} += "${config_dir}/thermal-policy.yaml"
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/thermal-policy/thermal-policy.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/thermal-policy/thermal-policy.yaml
new file mode 100644
index 000000000..7c48509c5
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/dbus/thermal-policy/thermal-policy.yaml
@@ -0,0 +1,187 @@
+# Machine thermal policy for PDM.
+#
+# Shut down the system if more than three cores
+# have a temperature greater than 115 degrees Celcius.
+
+
+- name: core sensors
+ description: >
+ 'The machine has two processor 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