Add mihawk sensor, fan control and d-bus monitor

Most of mihawk's sensors are different from witherspoon, so I temporarily
added the mihawk part and did not change the witherspoon.

Add mihawk version of fan control and d-bus monitor.
Mihawk does not have a water cooled mode, so another independent folder is added.

Tested: 1.Shut down the system if more than three cores
          have a temperature greater than 100 degrees Celcius.
        2.Fan control support cpu core, dimm, Onboard.
        3.Confirm that sensor is able to return normally via REST.

Signed-off-by: Ben Pai <Ben_Pai@wistron.com>
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Change-Id: I346fd70fe435eef4a745dc5863ce023037e0f151
diff --git a/meta-witherspoon/recipes-phosphor/dbus/fan-policy.bb b/meta-witherspoon/recipes-phosphor/dbus/fan-policy.bb
index 1219464..e53d9c0 100644
--- a/meta-witherspoon/recipes-phosphor/dbus/fan-policy.bb
+++ b/meta-witherspoon/recipes-phosphor/dbus/fan-policy.bb
@@ -9,15 +9,20 @@
 FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
 
 SRC_URI += "file://air-cooled.yaml"
-SRC_URI += "file://water-cooled.yaml"
+SRC_URI_append_ibm-ac-server = " file://water-cooled.yaml"
 SRC_URI += "file://fan-errors.yaml"
 
-do_install() {
+do_install_append_ibm-ac-server() {
         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
 }
 
+do_install_append_mihawk() {
+        install -D ${WORKDIR}/air-cooled.yaml ${D}${config_dir}/air-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}_append_ibm-ac-server = " ${config_dir}/water-cooled.yaml"
 FILES_${PN} += "${config_dir}/fan-errors.yaml"
diff --git a/meta-witherspoon/recipes-phosphor/dbus/fan-policy/mihawk/air-cooled.yaml b/meta-witherspoon/recipes-phosphor/dbus/fan-policy/mihawk/air-cooled.yaml
new file mode 100644
index 0000000..52232e3
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/dbus/fan-policy/mihawk/air-cooled.yaml
@@ -0,0 +1,339 @@
+# Air cooled mihawk fan policy for PDM.
+#
+# An air cooled mihawk 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 mihawk has 6 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
+    - meta: FAN
+      path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4
+    - meta: FAN
+      path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5
+
+- 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
+    - meta: FAN
+      path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4/fan4_0
+    - meta: FAN
+      path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4/fan4_1
+    - meta: FAN
+      path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5/fan5_0
+    - meta: FAN
+      path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5/fan5_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: 6
+  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 25 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: 25000000us
+  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 25 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: 25000000us
+  callback: log and poweroff
+  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-witherspoon/recipes-phosphor/dbus/fan-policy/mihawk/fan-errors.yaml b/meta-witherspoon/recipes-phosphor/dbus/fan-policy/mihawk/fan-errors.yaml
new file mode 100644
index 0000000..65cfbeb
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/dbus/fan-policy/mihawk/fan-errors.yaml
@@ -0,0 +1,905 @@
+# Witherspoon fan error policy for PDM.
+#
+# * Create a NotPresent error if fan 0, 1, 2, 3, 4, or 5 is not present for more
+#   than 20 seconds.
+# * Create a Nonfunctional error if fan 0, 1, 2, 3, 4, or 5 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: fan4
+  class: group
+  group: path
+  members:
+    - meta: FAN
+      path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4
+
+- name: fan5
+  class: group
+  group: path
+  members:
+    - meta: FAN
+      path: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5
+
+
+- name: chassis state
+  description: >
+    '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 fan4 presence
+  description: >
+    'Trigger logic on fan4 presence state changes.'
+  class: watch
+  watch: property
+  paths: fan4
+  properties: fan present
+  callback: check power fan4 presence
+
+- name: watch fan4 functional
+  description: >
+    'Trigger logic on fan4 functional state changes.'
+  class: watch
+  watch: property
+  paths: fan4
+  properties: fan functional
+  callback: check power fan4 functional
+
+- name: watch fan5 presence
+  description: >
+    'Trigger logic on fan5 presence state changes.'
+  class: watch
+  watch: property
+  paths: fan5
+  properties: fan present
+  callback: check power fan5 presence
+
+- name: watch fan5 functional
+  description: >
+    'Trigger logic on fan5 functional state changes.'
+  class: watch
+  watch: property
+  paths: fan5
+  properties: fan functional
+  callback: check power fan5 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: watch fan4 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: fan4
+  properties: fan present and functional
+  callback: resolve fan4 errors if present and functional
+
+- name: watch fan5 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: fan5
+  properties: fan present and functional
+  callback: resolve fan5 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 power fan4 presence
+  description: >
+    'If the chassis has power, check presence of fan4.'
+  class: condition
+  condition: count
+  paths: chassis state
+  properties: chassis powered
+  callback: check fan4 presence
+  countop: '>'
+  countbound: 0
+  op: '=='
+  bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan4 functional
+  description: >
+    'If the chassis has power, check functional of fan4.'
+  class: condition
+  condition: count
+  paths: chassis state
+  properties: chassis powered
+  callback: check fan4 functional
+  countop: '>'
+  countbound: 0
+  op: '=='
+  bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan5 presence
+  description: >
+    'If the chassis has power, check presence of fan5.'
+  class: condition
+  condition: count
+  paths: chassis state
+  properties: chassis powered
+  callback: check fan5 presence
+  countop: '>'
+  countbound: 0
+  op: '=='
+  bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check power fan5 functional
+  description: >
+    'If the chassis has power, check functional of fan5.'
+  class: condition
+  condition: count
+  paths: chassis state
+  properties: chassis powered
+  callback: check fan5 functional
+  countop: '>'
+  countbound: 0
+  op: '=='
+  bound: xyz.openbmc_project.State.Chassis.PowerState.On
+
+- name: check fans
+  description: >
+    'Verify each of the 12 fans are present.'
+  class: callback
+  callback: group
+  members:
+    - check fan0 presence
+    - check fan1 presence
+    - check fan2 presence
+    - check fan3 presence
+    - check fan4 presence
+    - check fan5 presence
+    - check fan0 functional
+    - check fan1 functional
+    - check fan2 functional
+    - check fan3 functional
+    - check fan4 functional
+    - check fan5 functional
+
+- name: check fan0 presence
+  description: >
+    'If this condition passes fan0 has been unplugged for more than 20 seconds.'
+  class: condition
+  condition: count
+  paths: fan0
+  properties: fan present
+  defer: 20000000us
+  callback: notpresent fan0 error
+  countop: '<'
+  countbound: 1
+  op: '=='
+  bound: true
+
+- name: check fan0 functional
+  description: >
+    'If this condition passes fan0 has been marked as nonfunctional.'
+  class: condition
+  condition: count
+  paths: fan0
+  properties: fan functional
+  callback: nonfunctional fan0 error
+  countop: '>'
+  countbound: 0
+  op: '=='
+  bound: false
+
+- name: check fan1 presence
+  description: >
+    'If this condition passes fan1 has been unplugged for more than 20 seconds.'
+  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 fan4 presence
+  description: >
+    'If this condition passes fan4 has been unplugged for more than 20 seconds.'
+  class: condition
+  condition: count
+  paths: fan4
+  properties: fan present
+  defer: 20000000us
+  callback: notpresent fan4 error
+  countop: '<'
+  countbound: 1
+  op: '=='
+  bound: true
+
+- name: check fan4 functional
+  description: >
+    'If this condition passes fan4 has been marked as nonfunctional.'
+  class: condition
+  condition: count
+  paths: fan4
+  properties: fan functional
+  callback: nonfunctional fan4 error
+  countop: '>'
+  countbound: 0
+  op: '=='
+  bound: false
+
+- name: check fan5 presence
+  description: >
+    'If this condition passes fan5 has been unplugged for more than 20 seconds.'
+  class: condition
+  condition: count
+  paths: fan5
+  properties: fan present
+  defer: 20000000us
+  callback: notpresent fan5 error
+  countop: '<'
+  countbound: 1
+  op: '=='
+  bound: true
+
+- name: check fan5 functional
+  description: >
+    'If this condition passes fan5 has been marked as nonfunctional.'
+  class: condition
+  condition: count
+  paths: fan5
+  properties: fan functional
+  callback: nonfunctional fan5 error
+  countop: '>'
+  countbound: 0
+  op: '=='
+  bound: false
+
+- name: notpresent fan0 error
+  class: callback
+  callback: elog
+  paths: fan0
+  properties: fan present
+  error: xyz::openbmc_project::Inventory::Error::NotPresent
+  metadata:
+    - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
+      type: string
+
+- name: nonfunctional fan0 error
+  class: callback
+  callback: elog
+  paths: fan0
+  properties: fan functional
+  error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+  metadata:
+    - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan0
+      type: string
+
+- name: notpresent fan1 error
+  class: callback
+  callback: elog
+  paths: fan1
+  properties: fan present
+  error: xyz::openbmc_project::Inventory::Error::NotPresent
+  metadata:
+    - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1
+      type: string
+
+- name: nonfunctional fan1 error
+  class: callback
+  callback: elog
+  paths: fan1
+  properties: fan functional
+  error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+  metadata:
+    - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan1
+      type: string
+
+- name: notpresent fan2 error
+  class: callback
+  callback: elog
+  paths: fan2
+  properties: fan present
+  error: xyz::openbmc_project::Inventory::Error::NotPresent
+  metadata:
+    - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
+      type: string
+
+- name: nonfunctional fan2 error
+  class: callback
+  callback: elog
+  paths: fan2
+  properties: fan functional
+  error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+  metadata:
+    - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan2
+      type: string
+
+- name: notpresent fan3 error
+  class: callback
+  callback: elog
+  paths: fan3
+  properties: fan present
+  error: xyz::openbmc_project::Inventory::Error::NotPresent
+  metadata:
+    - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
+      type: string
+
+- name: nonfunctional fan3 error
+  class: callback
+  callback: elog
+  paths: fan3
+  properties: fan functional
+  error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+  metadata:
+    - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan3
+      type: string
+
+- name: notpresent fan4 error
+  class: callback
+  callback: elog
+  paths: fan4
+  properties: fan present
+  error: xyz::openbmc_project::Inventory::Error::NotPresent
+  metadata:
+    - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4
+      type: string
+
+- name: nonfunctional fan4 error
+  class: callback
+  callback: elog
+  paths: fan4
+  properties: fan functional
+  error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+  metadata:
+    - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4
+      type: string
+
+- name: notpresent fan5 error
+  class: callback
+  callback: elog
+  paths: fan5
+  properties: fan present
+  error: xyz::openbmc_project::Inventory::Error::NotPresent
+  metadata:
+    - name: xyz::openbmc_project::Inventory::NotPresent::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5
+      type: string
+
+- name: nonfunctional fan5 error
+  class: callback
+  callback: elog
+  paths: fan5
+  properties: fan functional
+  error: xyz::openbmc_project::Inventory::Error::Nonfunctional
+  metadata:
+    - name: xyz::openbmc_project::Inventory::Nonfunctional::CALLOUT_INVENTORY_PATH
+      value: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5
+      type: string
+
+- name: resolve fan0 errors if 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
+
+- 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 fan4 errors if present and functional
+  description: >
+    'If fan4 is present and functional, call the resolve fan4 errors callback.'
+  class: condition
+  condition: count
+  paths: fan4
+  properties: fan present and functional
+  callback: resolve fan4 errors
+  countop: '=='
+  countbound: 2
+  op: '=='
+  bound: true
+
+- name: resolve fan5 errors if present and functional
+  description: >
+    'If fan5 is present and functional, call the resolve fan5 errors callback.'
+  class: condition
+  condition: count
+  paths: fan5
+  properties: fan present and functional
+  callback: resolve fan5 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
+
+- name: resolve fan4 errors
+  class: callback
+  callback: resolve callout
+  paths: fan4
+  properties: fan present and functional
+  callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan4
+
+- name: resolve fan5 errors
+  class: callback
+  callback: resolve callout
+  paths: fan5
+  properties: fan present and functional
+  callout: /xyz/openbmc_project/inventory/system/chassis/motherboard/fan5
diff --git a/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor-config.bbappend b/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor-config.bbappend
index 185db10..3a18960 100644
--- a/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor-config.bbappend
+++ b/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor-config.bbappend
@@ -2,3 +2,7 @@
 PHOSPHOR_DBUS_MONITOR_CONFIGS_append_ibm-ac-server = " thermal-policy"
 PHOSPHOR_DBUS_MONITOR_CONFIGS_append_ibm-ac-server = " power-supply-policy"
 PHOSPHOR_DBUS_MONITOR_CONFIGS_append_ibm-ac-server = " events-policy"
+PHOSPHOR_DBUS_MONITOR_CONFIGS_append_mihawk = " fan-policy"
+PHOSPHOR_DBUS_MONITOR_CONFIGS_append_mihawk = " thermal-policy"
+PHOSPHOR_DBUS_MONITOR_CONFIGS_append_mihawk = " power-supply-policy"
+PHOSPHOR_DBUS_MONITOR_CONFIGS_append_mihawk = " events-policy"
diff --git a/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor_%.bbappend b/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor_%.bbappend
index 8e1bf41..5c9d0b1 100644
--- a/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor_%.bbappend
+++ b/meta-witherspoon/recipes-phosphor/dbus/phosphor-dbus-monitor_%.bbappend
@@ -1 +1,2 @@
 SYSTEMD_LINK_phosphor-msl-verify_append_ibm-ac-server = " ../phosphor-msl-verify.service:obmc-chassis-poweron@0.target.requires/phosphor-msl-verify.service"
+SYSTEMD_LINK_phosphor-msl-verify_append_mihawk = " ../phosphor-msl-verify.service:obmc-chassis-poweron@0.target.requires/phosphor-msl-verify.service"
diff --git a/meta-witherspoon/recipes-phosphor/dbus/thermal-policy.bb b/meta-witherspoon/recipes-phosphor/dbus/thermal-policy.bb
index 9fb7d25..5631ec4 100644
--- a/meta-witherspoon/recipes-phosphor/dbus/thermal-policy.bb
+++ b/meta-witherspoon/recipes-phosphor/dbus/thermal-policy.bb
@@ -8,7 +8,7 @@
 
 FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
 
-SRC_URI += "file://thermal-policy.yaml"
+SRC_URI = "file://thermal-policy.yaml"
 
 do_install() {
         install -D ${WORKDIR}/thermal-policy.yaml ${D}${config_dir}/thermal-policy.yaml
diff --git a/meta-witherspoon/recipes-phosphor/dbus/thermal-policy/thermal-policy.yaml b/meta-witherspoon/recipes-phosphor/dbus/thermal-policy/ibm-ac-server/thermal-policy.yaml
similarity index 100%
rename from meta-witherspoon/recipes-phosphor/dbus/thermal-policy/thermal-policy.yaml
rename to meta-witherspoon/recipes-phosphor/dbus/thermal-policy/ibm-ac-server/thermal-policy.yaml
diff --git a/meta-witherspoon/recipes-phosphor/dbus/thermal-policy/mihawk/thermal-policy.yaml b/meta-witherspoon/recipes-phosphor/dbus/thermal-policy/mihawk/thermal-policy.yaml
new file mode 100644
index 0000000..f8e89b2
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/dbus/thermal-policy/mihawk/thermal-policy.yaml
@@ -0,0 +1,187 @@
+# Mihawk thermal policy for PDM.
+#
+# Shut down the system if more than three cores
+# have a temperature greater than 100 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