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/fans/phosphor-fan-control-events-config/mihawk/events.yaml b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-events-config/mihawk/events.yaml
new file mode 100644
index 0000000..b7fd1f7
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-events-config/mihawk/events.yaml
@@ -0,0 +1,586 @@
+groups:
+    - name: zone0_control_mode
+      description: Thermal control mode for zone 0
+      service: xyz.openbmc_project.Control.Thermal
+      type: /xyz/openbmc_project/control/thermal
+      members:
+          - /0
+    - name: air_cooled_zone0_fans
+      description: Group of fan inventory objects for air cooled zone 0
+      type: /xyz/openbmc_project/inventory
+      members:
+          - /system/chassis/motherboard/fan0
+          - /system/chassis/motherboard/fan1
+          - /system/chassis/motherboard/fan2
+          - /system/chassis/motherboard/fan3
+          - /system/chassis/motherboard/fan4
+          - /system/chassis/motherboard/fan5
+    - name: zone0_ambient
+      description: Group of ambient temperature sensors for zone 0
+      type: /xyz/openbmc_project/sensors
+      members:
+          - /temperature/ambient_temp
+    - name: occ0_object
+      description: Dbus object containing OCC0 properties
+      type: /org/open_power/control
+      members:
+          - /occ0
+    - name: occ1_object
+      description: Dbus object containing OCC1 properties
+      type: /org/open_power/control
+      members:
+          - /occ1
+    - name: zone0_cores
+      description: Group of core temperature sensors for zone 0
+      type: /xyz/openbmc_project/sensors
+      members:
+          - /temperature/p0_core0_temp
+          - /temperature/p0_core1_temp
+          - /temperature/p0_core2_temp
+          - /temperature/p0_core3_temp
+          - /temperature/p0_core4_temp
+          - /temperature/p0_core5_temp
+          - /temperature/p0_core6_temp
+          - /temperature/p0_core7_temp
+          - /temperature/p0_core8_temp
+          - /temperature/p0_core9_temp
+          - /temperature/p0_core10_temp
+          - /temperature/p0_core11_temp
+          - /temperature/p0_core12_temp
+          - /temperature/p0_core13_temp
+          - /temperature/p0_core14_temp
+          - /temperature/p0_core15_temp
+          - /temperature/p0_core16_temp
+          - /temperature/p0_core17_temp
+          - /temperature/p0_core18_temp
+          - /temperature/p0_core19_temp
+          - /temperature/p0_core20_temp
+          - /temperature/p0_core21_temp
+          - /temperature/p0_core22_temp
+          - /temperature/p0_core23_temp
+          - /temperature/p1_core0_temp
+          - /temperature/p1_core1_temp
+          - /temperature/p1_core2_temp
+          - /temperature/p1_core3_temp
+          - /temperature/p1_core4_temp
+          - /temperature/p1_core5_temp
+          - /temperature/p1_core6_temp
+          - /temperature/p1_core7_temp
+          - /temperature/p1_core8_temp
+          - /temperature/p1_core9_temp
+          - /temperature/p1_core10_temp
+          - /temperature/p1_core11_temp
+          - /temperature/p1_core12_temp
+          - /temperature/p1_core13_temp
+          - /temperature/p1_core14_temp
+          - /temperature/p1_core15_temp
+          - /temperature/p1_core16_temp
+          - /temperature/p1_core17_temp
+          - /temperature/p1_core18_temp
+          - /temperature/p1_core19_temp
+          - /temperature/p1_core20_temp
+          - /temperature/p1_core21_temp
+          - /temperature/p1_core22_temp
+          - /temperature/p1_core23_temp
+    - name: zone0_dimms
+      description: Group of dimm temperature sensors for zone 0
+      type: /xyz/openbmc_project/sensors
+      members:
+          - /temperature/dimm0_temp
+          - /temperature/dimm1_temp
+          - /temperature/dimm2_temp
+          - /temperature/dimm3_temp
+          - /temperature/dimm4_temp
+          - /temperature/dimm5_temp
+          - /temperature/dimm6_temp
+          - /temperature/dimm7_temp
+          - /temperature/dimm8_temp
+          - /temperature/dimm9_temp
+          - /temperature/dimm10_temp
+          - /temperature/dimm11_temp
+          - /temperature/dimm12_temp
+          - /temperature/dimm13_temp
+          - /temperature/dimm14_temp
+          - /temperature/dimm15_temp
+          - /temperature/dimm16_temp
+          - /temperature/dimm17_temp
+          - /temperature/dimm18_temp
+          - /temperature/dimm19_temp
+          - /temperature/dimm20_temp
+          - /temperature/dimm21_temp
+          - /temperature/dimm22_temp
+          - /temperature/dimm23_temp
+          - /temperature/dimm24_temp
+          - /temperature/dimm25_temp
+          - /temperature/dimm26_temp
+          - /temperature/dimm27_temp
+          - /temperature/dimm28_temp
+          - /temperature/dimm29_temp
+          - /temperature/dimm30_temp
+          - /temperature/dimm31_temp
+    - name: zone0_onboard
+      description: Group of onboard temperature sensors for zone 0
+      type: /xyz/openbmc_project/sensors
+      members:
+          - /temperature/p0_pcie_temp
+          - /temperature/p1_pcie_temp
+    - name: zone0_vrd
+      description: Group of vrd temperature sensors for zone 0
+      type: /xyz/openbmc_project/sensors
+      members:
+          - /temperature/p0_vcs_temp
+          - /temperature/p0_vdn_temp
+          - /temperature/p1_vcs_temp
+          - /temperature/p1_vdn_temp
+          - /temperature/p0_vdd_temp
+          - /temperature/p1_vdd_temp
+matches:
+    - name: propertiesChanged
+      description: >
+          A property changed match
+      parameters:
+          - object
+          - interface
+      signal: propertySignal
+    - name: interfacesAdded
+      description: >
+          An interfaces added match
+      parameters:
+          - object
+      signal: objectSignal
+    - name: interfacesRemoved
+      description: >
+          An interfaces removed match
+      parameters:
+          - object
+      signal:
+          name: objectSignal
+          parameters:
+              - object
+              - interface
+          handler: removeInterface
+    - name: nameOwnerChanged
+      description: >
+          A name owner changed match
+      parameters:
+          - object
+          - interface
+      signal: ownerSignal
+
+signals:
+    - name: propertySignal
+      description: >
+          Handle property signals
+      parameters:
+          - type
+          - object
+          - interface
+          - property
+      handler: setProperty
+    - name: objectSignal
+      description: >
+          Handle object signals
+      parameters:
+          - type
+          - object
+          - interface
+          - property
+      handler: setProperty
+    - name: ownerSignal
+      description: >
+          Handle owner signals
+      parameters:
+          - object
+          - interface
+      handler: setService
+
+handlers:
+    - name: setProperty
+      description: >
+          Sets a value for the given object/interface/property
+      parameters:
+          - type
+          - object
+          - interface
+          - property
+    - name: setService
+      description: >
+          Sets the service name and ownership status for the given group
+      parameters:
+          - group
+    - name: removeInterface
+      description: >
+          Removes an interface(and all associated properties) on the
+          given object from use within all event actions
+      parameters:
+          - object
+          - interface
+
+preconditions:
+    - name: property_states_match
+      description: >
+          All defined properties must match the values given to
+          enable a set speed event otherwise fan speeds are set to full
+      parameters:
+          - groups
+
+actions:
+    - name: call_actions_based_on_timer
+      description: >
+          Sets up a list of actions to be invoked when the defined timer
+          expires (or for each expiration of a repeating timer)
+      parameters:
+          - timer
+          - actions
+    - name: default_floor_on_missing_owner
+      description: >
+          Set the fan floor to the default floor
+    - name: set_speed_on_missing_owner
+      description: >
+          Set fans to the given speed when any service within the group
+          no longer exists
+      parameters:
+          - speed
+    - name: set_request_speed_base_with_max
+      description: >
+          Set the base request speed of a zone to the max value of a group for
+          calculating a new target speed
+    - name: count_state_before_speed
+      description: Set the speed when a number of properties at a state
+      parameters:
+          - count
+          - property
+          - speed
+    - name: set_floor_from_average_sensor_value
+      description: Set floor speed from first entry with average less than key
+      parameters:
+          - map
+    - name: set_ceiling_from_average_sensor_value
+      description: Set ceiling speed based on key transition values with average
+      parameters:
+          - map
+    - name: set_net_increase_speed
+      description: >
+          Set the speed increase delta based on a factor applied to
+          the delta increase size times the given value and property's
+          value difference
+      parameters:
+          - property
+          - factor
+          - delta
+    - name: set_net_decrease_speed
+      description: >
+          Set the speed decrease delta based on a factor applied to
+          the delta decrease size times the given value and property's
+          value difference
+      parameters:
+          - property
+          - factor
+          - delta
+    - name: use_alternate_events_on_state
+      description: >
+          Replaces a set of default events with an alternate set of events
+          when all the group properties are at a given state
+      parameters:
+          - property
+          - defevents
+          - altevents
+
+events:
+    - name: missing_before_high_speed_air
+      groups:
+          - name: air_cooled_zone0_fans
+            zone_conditions:
+                - name: air_cooled_chassis
+                  zones:
+                      - 0
+            interface: xyz.openbmc_project.Inventory.Item
+            property:
+                name: Present
+                type: bool
+      matches:
+          - name: interfacesAdded
+          - name: propertiesChanged
+      actions:
+          - name: count_state_before_speed
+            count: 1
+            property:
+                value: false
+                type: bool
+            speed:
+                value: 255
+                type: uint64_t
+    - name: fails_before_high_speed_air
+      groups:
+          - name: air_cooled_zone0_fans
+            zone_conditions:
+                - name: air_cooled_chassis
+                  zones:
+                      - 0
+            interface: xyz.openbmc_project.State.Decorator.OperationalStatus
+            property:
+                name: Functional
+                type: bool
+      matches:
+          - name: propertiesChanged
+      actions:
+          - name: count_state_before_speed
+            count: 1
+            property:
+                value: false
+                type: bool
+            speed:
+                value: 255
+                type: uint64_t
+    - name: set_air_cooled_speed_boundaries_based_on_ambient
+      groups:
+          - name: zone0_control_mode
+            zone_conditions:
+                - name: air_cooled_chassis
+                  zones:
+                      - 0
+            interface: xyz.openbmc_project.Control.ThermalMode
+            property:
+                name: Current
+                type: std::string
+      matches:
+          - name: propertiesChanged
+      actions:
+          - name: use_alternate_events_on_state
+            property:
+                value: CUSTOM
+                type: std::string
+            defevents:
+                - name: default_floor_boundary
+                  groups:
+                      - name: zone0_ambient
+                        zone_conditions:
+                            - name: air_cooled_chassis
+                              zones:
+                                  - 0
+                        interface: xyz.openbmc_project.Sensor.Value
+                        property:
+                            name: Value
+                            type: int64_t
+                  matches:
+                      - name: propertiesChanged
+                  actions:
+                      - name: set_floor_from_average_sensor_value
+                        map:
+                            value:
+                                - 25000: 85
+                                - 26000: 85
+                                - 28000: 97
+                                - 31000: 116
+                                - 33000: 128
+                                - 36000: 148
+                                - 38000: 160
+                                - 41000: 255
+                            type: std::map<int64_t, uint64_t>
+                      - name: set_ceiling_from_average_sensor_value
+                        map:
+                            value:
+                                - 25000: 255
+                                - 27000: 255
+                            type: std::map<int64_t, uint64_t>
+            altevents:
+                - name: alternate_floor_boundary
+                  groups:
+                      - name: zone0_ambient
+                        zone_conditions:
+                            - name: air_cooled_chassis
+                              zones:
+                                  - 0
+                        interface: xyz.openbmc_project.Sensor.Value
+                        property:
+                            name: Value
+                            type: int64_t
+                  matches:
+                      - name: propertiesChanged
+                  actions:
+                      - name: set_floor_from_average_sensor_value
+                        map:
+                            value:
+                                - 25000: 255
+                                - 26000: 255
+                                - 28000: 255
+                                - 31000: 255
+                                - 33000: 255
+                                - 36000: 255
+                                - 38000: 255
+                                - 41000: 255
+                            type: std::map<int64_t, uint64_t>
+                      - name: set_ceiling_from_average_sensor_value
+                        map:
+                            value:
+                                - 25000: 255
+                                - 27000: 255
+                            type: std::map<int64_t, uint64_t>
+    - name: occ_active_speed_changes
+      precondition:
+          name: property_states_match
+          groups:
+              - name: occ0_object
+                interface: org.open_power.OCC.Status
+                property:
+                    name: OccActive
+                    type: bool
+                    value: true
+              - name: occ1_object
+                interface: org.open_power.OCC.Status
+                property:
+                    name: OccActive
+                    type: bool
+                    value: true
+          matches:
+              - name: interfacesAdded
+              - name: propertiesChanged
+          events:
+              - name: speed_changes_based_on_core_temps
+                groups:
+                    - name: zone0_cores
+                      zone_conditions:
+                          - name: air_cooled_chassis
+                            zones:
+                                - 0
+                      interface: xyz.openbmc_project.Sensor.Value
+                      property:
+                          name: Value
+                          type: int64_t
+                matches:
+                    - name: interfacesAdded
+                    - name: propertiesChanged
+                    - name: interfacesRemoved
+                actions:
+                    - name: set_net_increase_speed
+                      property:
+                          value: 75000
+                          type: int64_t
+                      factor:
+                          value: 1000
+                          type: int64_t
+                      delta:
+                          value: 13
+                          type: uint64_t
+                    - name: set_net_decrease_speed
+                      property:
+                          value: 70000
+                          type: int64_t
+                      factor:
+                          value: 7000
+                          type: int64_t
+                      delta:
+                          value: 5
+                          type: uint64_t
+                timer:
+                    interval: 1
+              - name: speed_changes_based_on_dimm_temps
+                groups:
+                    - name: zone0_dimms
+                      interface: xyz.openbmc_project.Sensor.Value
+                      property:
+                          name: Value
+                          type: int64_t
+                matches:
+                    - name: interfacesAdded
+                    - name: propertiesChanged
+                    - name: interfacesRemoved
+                actions:
+                    - name: set_net_increase_speed
+                      property:
+                          value: 80000
+                          type: int64_t
+                      factor:
+                          value: 1000
+                          type: int64_t
+                      delta:
+                          value: 8
+                          type: uint64_t
+                    - name: set_net_decrease_speed
+                      property:
+                          value: 75000
+                          type: int64_t
+                      factor:
+                          value: 3000
+                          type: int64_t
+                      delta:
+                          value: 3
+                          type: uint64_t
+                timer:
+                    interval: 5
+              - name: speed_changes_based_on_onboard_temps
+                groups:
+                    - name: zone0_onboard
+                      zone_conditions:
+                          - name: air_cooled_chassis
+                            zones:
+                                - 0
+                      interface: xyz.openbmc_project.Sensor.Value
+                      property:
+                          name: Value
+                          type: int64_t
+                matches:
+                    - name: interfacesAdded
+                    - name: propertiesChanged
+                    - name: interfacesRemoved
+                actions:
+                    - name: set_net_increase_speed
+                      property:
+                          value: 50000
+                          type: int64_t
+                      factor:
+                          value: 1000
+                          type: int64_t
+                      delta:
+                          value: 8
+                          type: uint64_t
+                    - name: set_net_decrease_speed
+                      property:
+                          value: 47000
+                          type: int64_t
+                      factor:
+                          value: 3000
+                          type: int64_t
+                      delta:
+                          value: 3
+                          type: uint64_t
+                timer:
+                    interval: 10
+              - name: speed_changes_based_on_vrd_temps
+                groups:
+                    - name: zone0_vrd
+                      zone_conditions:
+                          - name: air_cooled_chassis
+                            zones:
+                                - 0
+                      interface: xyz.openbmc_project.Sensor.Value
+                      property:
+                          name: Value
+                          type: int64_t
+                matches:
+                    - name: interfacesAdded
+                    - name: propertiesChanged
+                    - name: interfacesRemoved
+                actions:
+                    - name: set_net_increase_speed
+                      property:
+                          value: 90000
+                          type: int64_t
+                      factor:
+                          value: 1000
+                          type: int64_t
+                      delta:
+                          value: 5
+                          type: uint64_t
+                    - name: set_net_decrease_speed
+                      property:
+                          value: 85000
+                          type: int64_t
+                      factor:
+                          value: 3000
+                          type: int64_t
+                      delta:
+                          value: 3
+                          type: uint64_t
+                timer:
+                    interval: 10
diff --git a/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-fan-config/mihawk/fans.yaml b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-fan-config/mihawk/fans.yaml
new file mode 100644
index 0000000..9133fa1
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-fan-config/mihawk/fans.yaml
@@ -0,0 +1,31 @@
+fans:
+  - inventory: /system/chassis/motherboard/fan0
+    cooling_zone: 0
+    sensors:
+      - fan0_0
+    target_interface: xyz.openbmc_project.Control.FanPwm
+  - inventory: /system/chassis/motherboard/fan1
+    cooling_zone: 0
+    sensors:
+      - fan1_0
+    target_interface: xyz.openbmc_project.Control.FanPwm
+  - inventory: /system/chassis/motherboard/fan2
+    cooling_zone: 0
+    sensors:
+      - fan2_0
+    target_interface: xyz.openbmc_project.Control.FanPwm
+  - inventory: /system/chassis/motherboard/fan3
+    cooling_zone: 0
+    sensors:
+      - fan3_0
+    target_interface: xyz.openbmc_project.Control.FanPwm
+  - inventory: /system/chassis/motherboard/fan4
+    cooling_zone: 0
+    sensors:
+      - fan4_0
+    target_interface: xyz.openbmc_project.Control.FanPwm
+  - inventory: /system/chassis/motherboard/fan5
+    cooling_zone: 0
+    sensors:
+      - fan5_0
+    target_interface: xyz.openbmc_project.Control.FanPwm
diff --git a/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config/mihawk/zone_conditions.yaml b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config/mihawk/zone_conditions.yaml
new file mode 100644
index 0000000..7dc99b6
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-conditions-config/mihawk/zone_conditions.yaml
@@ -0,0 +1,9 @@
+conditions:
+  - name: air_cooled_chassis
+    type: getProperty
+    properties:
+      - property: WaterCooled
+        interface: xyz.openbmc_project.Inventory.Decorator.CoolingType
+        path: /xyz/openbmc_project/inventory/system/chassis
+        type: bool
+        value: false
diff --git a/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-config/mihawk/zones.yaml b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-config/mihawk/zones.yaml
new file mode 100644
index 0000000..4deb252
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-control-zone-config/mihawk/zones.yaml
@@ -0,0 +1,42 @@
+manager_configuration:
+  power_on_delay: 20
+
+zone_configuration:
+
+#Air cooled zones
+- zone_conditions:
+  - name: air_cooled_chassis
+
+  zones:
+    - zone: 0
+      cooling_profiles:
+      - air
+      - all
+      full_speed: 255
+      default_floor: 195
+      increase_delay: 5
+      decrease_interval: 30
+      interfaces:
+          - name: xyz.openbmc_project.Control.ThermalMode
+            properties:
+                - name: Supported
+                  type: array[string]
+                  values:
+                      - value: DEFAULT
+                        description: >
+                            Default thermal control mode
+                      - value: CUSTOM
+                        description: >
+                            Custom thermal control mode for handling the use of
+                            optical cables located behind the GPU exhaust that
+                            could produce overtemp warnings without this mode
+                            enabled.
+                - name: Current
+                  type: string
+                  persist: true
+                  values:
+                      - value: DEFAULT
+                        description: >
+                            Set current thermal control mode to the
+                            default which will be replaced on startup if
+                            another selected mode was persisted.
\ No newline at end of file
diff --git a/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-monitor-config/mihawk/monitor.yaml b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-monitor-config/mihawk/monitor.yaml
new file mode 100644
index 0000000..076349d
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-monitor-config/mihawk/monitor.yaml
@@ -0,0 +1,96 @@
+fans:
+  - inventory: /system/chassis/motherboard/fan0
+    allowed_out_of_range_time: 10
+    deviation: 15
+    num_sensors_nonfunc_for_fan_nonfunc: 1
+    sensors:
+      - name: fan0_0
+        has_target: true
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
+      - name: fan0_1
+        has_target: false
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
+
+  - inventory: /system/chassis/motherboard/fan1
+    allowed_out_of_range_time: 10
+    deviation: 15
+    num_sensors_nonfunc_for_fan_nonfunc: 1
+    sensors:
+      - name: fan1_0
+        has_target: true
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
+      - name: fan1_1
+        has_target: false
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
+
+  - inventory: /system/chassis/motherboard/fan2
+    allowed_out_of_range_time: 10
+    deviation: 15
+    num_sensors_nonfunc_for_fan_nonfunc: 1
+    sensors:
+      - name: fan2_0
+        has_target: true
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
+      - name: fan2_1
+        has_target: false
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
+
+  - inventory: /system/chassis/motherboard/fan3
+    allowed_out_of_range_time: 10
+    deviation: 15
+    num_sensors_nonfunc_for_fan_nonfunc: 1
+    sensors:
+      - name: fan3_0
+        has_target: true
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
+      - name: fan3_1
+        has_target: false
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
+
+  - inventory: /system/chassis/motherboard/fan4
+    allowed_out_of_range_time: 10
+    deviation: 15
+    num_sensors_nonfunc_for_fan_nonfunc: 1
+    sensors:
+      - name: fan4_0
+        has_target: true
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
+      - name: fan4_1
+        has_target: false
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
+
+  - inventory: /system/chassis/motherboard/fan5
+    allowed_out_of_range_time: 10
+    deviation: 15
+    num_sensors_nonfunc_for_fan_nonfunc: 1
+    sensors:
+      - name: fan5_0
+        has_target: true
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
+      - name: fan5_1
+        has_target: false
+        target_interface: xyz.openbmc_project.Control.FanPwm
+        factor: 70
+        offset: 1200
diff --git a/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-presence-config/mihawk/config.yaml b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-presence-config/mihawk/config.yaml
new file mode 100644
index 0000000..9cb5ecd
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan-presence-config/mihawk/config.yaml
@@ -0,0 +1,47 @@
+- name: fan0
+  path: /system/chassis/motherboard/fan0
+  methods:
+    - type: gpio
+      key: 9
+      physpath: /sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/1e78a100.i2c-bus/i2c-3/3-0060
+      devpath: /dev/input/by-path/platform-gpio-keys-polled-event
+
+- name: fan1
+  path: /system/chassis/motherboard/fan1
+  methods:
+    - type: gpio
+      key: 10
+      physpath: /sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/1e78a100.i2c-bus/i2c-3/3-0060
+      devpath: /dev/input/by-path/platform-gpio-keys-polled-event
+
+- name: fan2
+  path: /system/chassis/motherboard/fan2
+  methods:
+    - type: gpio
+      key: 11
+      physpath: /sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/1e78a100.i2c-bus/i2c-3/3-0060
+      devpath: /dev/input/by-path/platform-gpio-keys-polled-event
+
+- name: fan3
+  path: /system/chassis/motherboard/fan3
+  methods:
+    - type: gpio
+      key: 12
+      physpath: /sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/1e78a100.i2c-bus/i2c-3/3-0060
+      devpath: /dev/input/by-path/platform-gpio-keys-polled-event
+
+- name: fan4
+  path: /system/chassis/motherboard/fan4
+  methods:
+    - type: gpio
+      key: 13
+      physpath: /sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/1e78a100.i2c-bus/i2c-3/3-0060
+      devpath: /dev/input/by-path/platform-gpio-keys-polled-event
+
+- name: fan5
+  path: /system/chassis/motherboard/fan5
+  methods:
+    - type: gpio
+      key: 14
+      physpath: /sys/devices/platform/ahb/ahb:apb/ahb:apb:bus@1e78a000/1e78a100.i2c-bus/i2c-3/3-0060
+      devpath: /dev/input/by-path/platform-gpio-keys-polled-event
diff --git a/meta-witherspoon/recipes-phosphor/fans/phosphor-fan/mihawk/obmc/phosphor-fan/phosphor-cooling-type-0.conf b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan/mihawk/obmc/phosphor-fan/phosphor-cooling-type-0.conf
new file mode 100644
index 0000000..21fcfcb
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan/mihawk/obmc/phosphor-fan/phosphor-cooling-type-0.conf
@@ -0,0 +1,3 @@
+OBJPATH="--path=/system/chassis"
+AIR="--air"
+
diff --git a/meta-witherspoon/recipes-phosphor/fans/phosphor-fan/mihawk/phosphor-cooling-type@.service b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan/mihawk/phosphor-cooling-type@.service
new file mode 100644
index 0000000..9232b13
--- /dev/null
+++ b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan/mihawk/phosphor-cooling-type@.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Phosphor Cooling Type
+Wants=mapper-wait@-xyz-openbmc_project-inventory.service
+After=mapper-wait@-xyz-openbmc_project-inventory.service
+ConditionPathExists={envfiledir}/obmc/phosphor-fan/phosphor-cooling-type-%i.conf
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+EnvironmentFile={envfiledir}/obmc/phosphor-fan/phosphor-cooling-type-%i.conf
+ExecStart=/usr/bin/env phosphor-cooling-type ${{OBJPATH}} ${{AIR}}
+SyslogIdentifier=phosphor-cooling-type
+
+[Install]
+RequiredBy=multi-user.target
diff --git a/meta-witherspoon/recipes-phosphor/fans/phosphor-fan_%.bbappend b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan_%.bbappend
index 88c32ff..085857c 100644
--- a/meta-witherspoon/recipes-phosphor/fans/phosphor-fan_%.bbappend
+++ b/meta-witherspoon/recipes-phosphor/fans/phosphor-fan_%.bbappend
@@ -3,9 +3,14 @@
 # Package configuration
 FAN_PACKAGES_append_ibm-ac-server = " \
         phosphor-cooling-type \
-"
+        "
+
+FAN_PACKAGES_append_mihawk = " \
+        phosphor-cooling-type \
+        "
 
 PACKAGECONFIG_append_ibm-ac-server = " cooling-type"
+PACKAGECONFIG_append_mihawk = " cooling-type"
 
 TMPL_COOLING = "phosphor-cooling-type@.service"
 INSTFMT_COOLING = "phosphor-cooling-type@{0}.service"
@@ -15,10 +20,14 @@
 FILES_phosphor-cooling-type_append_ibm-ac-server = " ${bindir}/phosphor-cooling-type"
 SYSTEMD_SERVICE_phosphor-cooling-type_append_ibm-ac-server = " ${TMPL_COOLING}"
 SYSTEMD_LINK_phosphor-cooling-type_append_ibm-ac-server = " ${@compose_list(d, 'FMT_COOLING', 'OBMC_CHASSIS_INSTANCES')}"
+FILES_phosphor-cooling-type_append_mihawk = " ${bindir}/phosphor-cooling-type"
+SYSTEMD_SERVICE_phosphor-cooling-type_append_mihawk = " ${TMPL_COOLING}"
+SYSTEMD_LINK_phosphor-cooling-type_append_mihawk = " ${@compose_list(d, 'FMT_COOLING', 'OBMC_CHASSIS_INSTANCES')}"
 
 COOLING_ENV_FMT = "obmc/phosphor-fan/phosphor-cooling-type-{0}.conf"
 
 SYSTEMD_ENVIRONMENT_FILE_phosphor-cooling-type_append_ibm-ac-server = " ${@compose_list(d, 'COOLING_ENV_FMT', 'OBMC_CHASSIS_INSTANCES')}"
+SYSTEMD_ENVIRONMENT_FILE_phosphor-cooling-type_append_mihawk = " ${@compose_list(d, 'COOLING_ENV_FMT', 'OBMC_CHASSIS_INSTANCES')}"
 
 #These services are protected by the watchdog
 SYSTEMD_OVERRIDE_phosphor-fan-control_witherspoon += "fan-watchdog-monitor.conf:phosphor-fan-control-init@0.service.d/fan-watchdog-monitor.conf"