Add Witherspoon fan policy
Add Witherspoon fan plug policy rules for the Witherspoon system.
An air cooled Witherspoon requires a minimum of three functional fans.
If the number of functional fans drops below that for longer than five
seconds power the system off.
A water cooled Witherspoon requires a minimum of two functional fans.
If the number of functional fans drops below that for longer than five
seconds power the system off.
Change-Id: I0bba905dcd7542c43215a051e2df2c87fefce154
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor-config-native%.bbappend b/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor-config-native%.bbappend
index e69de29..6bf76ab 100644
--- a/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor-config-native%.bbappend
+++ b/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor-config-native%.bbappend
@@ -0,0 +1 @@
+PHOSPHOR_DBUS_MONITOR_CONFIGS_append = " witherspoon-fan-policy-native"
diff --git a/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy-native.bb b/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy-native.bb
new file mode 100644
index 0000000..c2e843f
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy-native.bb
@@ -0,0 +1,14 @@
+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"
+
+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
+}
diff --git a/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/air-cooled.yaml b/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/air-cooled.yaml
new file mode 100644
index 0000000..ec11164
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/air-cooled.yaml
@@ -0,0 +1,226 @@
+# Air cooled Witherspoon fan policy for PDM.
+#
+# An air cooled Witherspoon requires a minimum of three functional fans.
+# If the number of functional fans drops below that
+# power the system off.
+
+- name: fans
+ description: >
+ 'An air cooled Witherspoon has four fans to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
+
+- 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 presence state changes.'
+ class: watch
+ watch: property
+ paths: fans
+ properties: fan present
+ callback: check cooling type
+
+- name: watch fan functional
+ description: >
+ 'Trigger logic on fan functional state changes.'
+ class: watch
+ watch: property
+ paths: fans
+ properties: fan functional
+ callback: check cooling type
+
+- name: watch chassis state
+ description: >
+ 'Trigger logic on chassis power state changes.'
+ class: watch
+ watch: property
+ paths: chassis state
+ properties: chassis powered
+ callback: check cooling type
+
+- name: watch cooling type
+ description: >
+ 'Maintain a cache of the chassis cooling type.'
+ class: watch
+ watch: property
+ paths: chassis
+ properties: chassis air cooled
+
+- name: check cooling type
+ description: >
+ 'If this condition passes the chassis is air cooled.'
+ class: condition
+ condition: count
+ paths: chassis
+ properties: chassis air cooled
+ callback: check fans
+ countop: '=='
+ countbound: 0
+ op: '=='
+ bound: true
+
+- name: check fans
+ description: >
+ 'Verify there are at least three functional fans.'
+ class: callback
+ callback: group
+ members:
+ - check presence
+ - check functional
+
+- name: check presence
+ description: >
+ 'If this condition passes more than one fan has been unplugged
+ for more than 25 seconds. Shut the system down. Count present
+ fans rather than non-present fans since the latter would pass
+ if the fan has not been created for some reason.
+
+ For a more detailed definition of unplugged, consult the documentation
+ of xyz.openbmc_project.Inventory.Item and/or the documentation
+ of the fan inventory object implementation.'
+ class: condition
+ condition: count
+ paths: fans
+ properties: fan present
+ defer: 25000000us
+ callback: check power
+ countop: '<'
+ countbound: 3
+ op: '=='
+ bound: true
+
+- name: check functional
+ description: >
+ 'If this condition passes more than one fan in the group has been
+ marked as nonfunctional for five seconds. Shut the system down.
+
+ For a more detailed definition of nonfunctional, consult the documentation
+ of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the
+ documentation of the fan inventory object implementation.'
+ class: condition
+ condition: count
+ paths: fans
+ properties: fan functional
+ defer: 5000000us
+ callback: check power
+ countop: '>'
+ countbound: 1
+ op: '=='
+ bound: false
+
+- name: check power
+ description: >
+ 'If the chassis has power, power it off.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: log and shutdown
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: log and shutdown
+ description: >
+ 'Shut the system down and log an event.'
+ class: callback
+ callback: group
+ members:
+ - shutdown
+ - log
+
+- 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
+ description: >
+ 'Log a shutdown event to the systemd journal.'
+ class: callback
+ callback: journal
+ paths: chassis state
+ properties: chassis powered
+ severity: ERR
+ message: Shutting down system. There are not enough functional fans.
diff --git a/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/water-cooled.yaml b/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/water-cooled.yaml
new file mode 100644
index 0000000..e1c610b
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/fans/witherspoon-fan-policy/water-cooled.yaml
@@ -0,0 +1,224 @@
+# Water cooled Witherspoon fan policy for PDM.
+#
+# A water cooled Witherspoon requires a minimum of two functional fans.
+# If the number of functional fans drops below that
+# power the system off.
+
+- name: fans
+ description: >
+ 'A water cooled Witherspoon has three fans to monitor.'
+ class: group
+ group: path
+ members:
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
+ - meta: FAN
+ path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
+ - 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: chassis powered
+ description: >
+ 'Monitor the chassis power state.'
+ class: group
+ group: property
+ type: string
+ members:
+ - interface: xyz.openbmc_project.State.Chassis
+ meta: CHASSIS_STATE
+ property: CurrentPowerState
+
+- name: chassis water cooled
+ description: >
+ 'Monitor the chassis cooling type.'
+ class: group
+ group: property
+ type: boolean
+ members:
+ - interface: xyz.openbmc_project.Inventory.Decorator.CoolingType
+ meta: COOLING_TYPE
+ property: WaterCooled
+
+- name: watch fan present
+ description: >
+ 'Trigger logic on fan presence state changes.'
+ class: watch
+ watch: property
+ paths: fans
+ properties: fan present
+ callback: check cooling type
+
+- name: watch fan functional
+ description: >
+ 'Trigger logic on fan functional state changes.'
+ class: watch
+ watch: property
+ paths: fans
+ properties: fan functional
+ callback: check cooling type
+
+- name: watch chassis state
+ description: >
+ 'Trigger logic on chassis power state changes.'
+ class: watch
+ watch: property
+ paths: chassis state
+ properties: chassis powered
+ callback: check cooling type
+
+- name: watch cooling type
+ description: >
+ 'Maintain a cache of the chassis cooling type.'
+ class: watch
+ watch: property
+ paths: chassis
+ properties: chassis water cooled
+
+- name: check cooling type
+ description: >
+ 'If this condition passes the chassis is water cooled.'
+ class: condition
+ condition: count
+ paths: chassis
+ properties: chassis water cooled
+ callback: check fans
+ countop: '=='
+ countbound: 1
+ op: '=='
+ bound: true
+
+- name: check fans
+ description: >
+ 'Verify there are at least two functional fans.'
+ class: callback
+ callback: group
+ members:
+ - check presence
+ - check functional
+
+- name: check presence
+ description: >
+ 'If this condition passes more than one fan has been unplugged
+ for more than 25 seconds. Shut the system down. Count present
+ fans rather than non-present fans since the latter would pass
+ if the fan has not been created for some reason.
+
+ For a more detailed definition of unplugged, consult the documentation
+ of xyz.openbmc_project.Inventory.Item and/or the documentation
+ of the fan inventory object implementation.'
+ class: condition
+ condition: count
+ paths: fans
+ properties: fan present
+ defer: 25000000us
+ callback: check power
+ countop: '<'
+ countbound: 2
+ op: '=='
+ bound: true
+
+- name: check functional
+ description: >
+ 'If this condition passes more than one fan in the group has been marked
+ as nonfunctional for five seconds. Shut the system down.
+
+ For a more detailed definition of nonfunctional, consult the documentation
+ of xyz.openbmc_project.State.Decorator.OperationalStatus and/or the
+ documentation of the fan inventory object implementation.'
+ class: condition
+ condition: count
+ paths: fans
+ properties: fan functional
+ defer: 5000000us
+ callback: check power
+ countop: '>'
+ countbound: 1
+ op: '=='
+ bound: false
+
+- name: check power
+ description: >
+ 'If the chassis has power, power it off.'
+ class: condition
+ condition: count
+ paths: chassis state
+ properties: chassis powered
+ callback: log and shutdown
+ countop: '>'
+ countbound: 0
+ op: '=='
+ bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: log and shutdown
+ description: >
+ 'Shut the system down and log an event.'
+ class: callback
+ callback: group
+ members:
+ - shutdown
+ - log
+
+- 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
+ description: >
+ 'Log a shutdown event to the systemd journal.'
+ class: callback
+ callback: journal
+ paths: chassis state
+ properties: chassis powered
+ severity: ERR
+ message: Shutting down system. There are not enough functional fans.