swift: Add dbus monitor policy configurations

Swift has two power supplies, same as Witherspoon, therefore will use
the same power supply policy configuration.

Swift and Witherspoon will also share the event policy configuration for
OCC throttling.

The thermal policy configuration will be shared between Swift and
Witherspoon, but may change for air cooled Swift to not also shutdown at
3 or more cores over 115C.

The fan policy configurations will be different for Swift, therefore
they will be separate. At this time, there are some areas unknown on how
fan presence and functional states will be handled for both air and
water cooled Swift machines, so these are configured to be the same.

Tested:
    Built witherspoon phosphor-dbus-monitor resulting in no image change
    Built swift phosphor-dbus-monitor resulting in correct policies

(From meta-ibm rev: fd06a2cbfd5f6e43aba4887ae1398984410d52cc)

Change-Id: I1125f00ecd51c23aac2da4cd2a47432ac3bc2de7
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/meta-ibm/meta-witherspoon/recipes-phosphor/fans/fan-policy/swift/water-cooled.yaml b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/fan-policy/swift/water-cooled.yaml
new file mode 100644
index 0000000..661021a
--- /dev/null
+++ b/meta-ibm/meta-witherspoon/recipes-phosphor/fans/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