summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaptor Engineering Development Team <support@raptorengineering.com>2020-02-16 20:56:49 +0000
committerRaptor Engineering Development Team <support@raptorengineering.com>2020-02-17 12:35:13 +0000
commitbc0ca9464ea7b062ac9432d9d03e72acae2078d0 (patch)
treec248dd645dba9adcebe913dffec58d32463d0e20
parent8e564b2fc9ff9ea64fd4362faf65fa550500f279 (diff)
downloadtalos-openbmc-bc0ca9464ea7b062ac9432d9d03e72acae2078d0.tar.gz
talos-openbmc-bc0ca9464ea7b062ac9432d9d03e72acae2078d0.zip
Switch fan controls from RCS PID to upstream swampid daemon
WARNING: HIC SUNT DRAGONES! ***WORK IN PROGRESS*** Basic functionality has been hacked in, but this should NOT be relied on in production environments without proper fixes originated from / merged into upstream OpenBMC.
-rwxr-xr-xmeta-openpower/recipes-phosphor/occ/openpower-occ-control/occ-active.sh4
-rw-r--r--meta-openpower/recipes-phosphor/packagegroups/packagegroup-op-apps.bb1
-rw-r--r--meta-rcs/meta-talos/conf/machine/talos.conf11
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail.bb26
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail/detect-fan-fail.service11
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail/detect-fan-fail.sh60
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend1
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml751
-rw-r--r--[-rwxr-xr-x]meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config-native/fans.yaml0
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml56
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/config-base.json2190
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/continue-if-sensor-not-present.patch384
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-boot-control.service10
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-control.sh12
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh21
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service12
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service14
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control_%.bbappend37
-rw-r--r--meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/bus@1e78a000/i2c-bus@440/max31785@52.conf3
-rw-r--r--meta-rcs/recipes-phosphor/image/obmc-phosphor-image.bbappend2
20 files changed, 2791 insertions, 815 deletions
diff --git a/meta-openpower/recipes-phosphor/occ/openpower-occ-control/occ-active.sh b/meta-openpower/recipes-phosphor/occ/openpower-occ-control/occ-active.sh
index ffd1e6bd0..edb35b311 100755
--- a/meta-openpower/recipes-phosphor/occ/openpower-occ-control/occ-active.sh
+++ b/meta-openpower/recipes-phosphor/occ/openpower-occ-control/occ-active.sh
@@ -62,7 +62,7 @@ busctl tree $OCC_CONTROL_SERVICE --list | grep occ | xargs -r -n1 -I{} \
if [ "$value" == "true" ]; then
# Wait 5 seconds before restarting fan controller
sleep 5
- systemctl restart phosphor-fan-control@0.service
+ systemctl restart phosphor-pid-control.service
else
# Unbind all OCC drivers to avoid bus contention on next IPL
echo occ-hwmon.1 > /sys/bus/platform/drivers/occ-hwmon/unbind || true
@@ -144,7 +144,7 @@ if [ "$1" == "watchdog" ]; then
sleep 5
# Restart fan controller
- systemctl restart phosphor-fan-control@0.service
+ systemctl restart phosphor-pid-control.service
fi
done
fi
diff --git a/meta-openpower/recipes-phosphor/packagegroups/packagegroup-op-apps.bb b/meta-openpower/recipes-phosphor/packagegroups/packagegroup-op-apps.bb
index 1ae123a3a..636c88b10 100644
--- a/meta-openpower/recipes-phosphor/packagegroups/packagegroup-op-apps.bb
+++ b/meta-openpower/recipes-phosphor/packagegroups/packagegroup-op-apps.bb
@@ -37,7 +37,6 @@ RDEPENDS_${PN}-chassis += "${@mf_enabled(d, 'p9-cfam-override', 'p9-cfam-overrid
SUMMARY_${PN}-fans = "OpenPOWER Fans"
RDEPENDS_${PN}-fans = " \
- obmc-control-fan \
"
SUMMARY_${PN}-flash = "OpenPOWER Flash"
diff --git a/meta-rcs/meta-talos/conf/machine/talos.conf b/meta-rcs/meta-talos/conf/machine/talos.conf
index 03713217f..f8d0c364e 100644
--- a/meta-rcs/meta-talos/conf/machine/talos.conf
+++ b/meta-rcs/meta-talos/conf/machine/talos.conf
@@ -3,7 +3,16 @@ KERNEL_DEVICETREE = "${KMACHINE}-bmc-opp-${MACHINE}.dtb"
UBOOT_MACHINE = "ast_g5_ncsi_config"
-OBMC_MACHINE_FEATURES += "obmc-mrw"
+OBMC_MACHINE_FEATURES += "\
+ obmc-mrw \
+ obmc-phosphor-fan-mgmt \
+ obmc-phosphor-chassis-mgmt \
+ obmc-phosphor-flash-mgmt \
+ obmc-host-ipmi \
+ obmc-host-state-mgmt \
+ obmc-chassis-state-mgmt \
+ obmc-bmc-state-mgmt \
+ "
OBMC_POWER_SUPPLY_INSTANCES = "0 1"
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail.bb b/meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail.bb
new file mode 100644
index 000000000..5328f9102
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail.bb
@@ -0,0 +1,26 @@
+SUMMARY = "OpenBMC Talos II Detect Fan Fail Service"
+DESCRIPTION = "OpenBMC Talos II Detect Fan Fail Daemon."
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+inherit systemd
+
+DEPENDS += "systemd"
+RDEPENDS_${PN} += "bash"
+
+FILESEXTRAPATHS_append_talos := "${THISDIR}/detect-fan-fail:"
+SRC_URI_append_talos = " file://detect-fan-fail.sh \
+ file://detect-fan-fail.service \
+ "
+
+do_install_append_talos() {
+ install -d ${D}${bindir}
+ install -m 0755 ${WORKDIR}/detect-fan-fail.sh ${D}${bindir}/
+
+ install -d ${D}${systemd_unitdir}/system/
+ install -m 0644 ${WORKDIR}/detect-fan-fail.service ${D}${systemd_unitdir}/system
+}
+
+SYSTEMD_PACKAGES = "${PN}"
+SYSTEMD_SERVICE_${PN} = "detect-fan-fail.service"
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail/detect-fan-fail.service b/meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail/detect-fan-fail.service
new file mode 100644
index 000000000..0ccafe35d
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail/detect-fan-fail.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Detect Fan Fail Manager
+After=phosphor-pid-control.service
+
+[Service]
+ExecStart=/usr/bin/detect-fan-fail.sh
+Restart=always
+StandardOutput=syslog
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail/detect-fan-fail.sh b/meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail/detect-fan-fail.sh
new file mode 100644
index 000000000..9f42e2350
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail/detect-fan-fail.sh
@@ -0,0 +1,60 @@
+#!/bin/bash
+#
+# Copyright 2020 Raptor Engineering, LLC
+
+# get fan state by d-bus command
+function get_fan_state() {
+ get_property_path='xyz.openbmc_project.Sensor.Threshold.Critical CriticalAlarmLow'
+ fan_state="$(busctl get-property $1 $2 $get_property_path | awk '{print $2}')"
+ echo "$fan_state"
+}
+
+# set fan pwm by d-bus command
+function set_fan_value() {
+ set_property_path='xyz.openbmc_project.Control.FanPwm'
+ busctl set-property $1 $2 $set_property_path Target t 255
+}
+
+fan_tach_path=( '/xyz/openbmc_project/sensors/fan_tach/fan0'
+ '/xyz/openbmc_project/sensors/fan_tach/fan1'
+ '/xyz/openbmc_project/sensors/fan_tach/fan2'
+ '/xyz/openbmc_project/sensors/fan_tach/fan3'
+ '/xyz/openbmc_project/sensors/fan_tach/fan4'
+ '/xyz/openbmc_project/sensors/fan_tach/fan5'
+ )
+
+check_fail_flag=0
+current_fan_state=()
+while true; do
+ for i in ${!fan_tach_path[@]};
+ do
+ hwmon_path="$(mapper get-service ${fan_tach_path[0]})"
+ current_fan_state[$i%2]=$(get_fan_state $hwmon_path ${fan_tach_path[$i]})
+
+ #Compare state of dual rotors with CriticalAlarmLow to check if fan fail
+ if [ ${#current_fan_state[@]} -eq 2 ];then
+ if [ "${current_fan_state[0]}" == "true" ] && \
+ [ "${current_fan_state[1]}" == "true" ] ;then
+ if [ $check_fail_flag -eq 0 ];then
+ systemctl stop phosphor-pid-control
+ for j in ${!fan_tach_path[@]};
+ do
+ #If fan fail is detect, set other fan rpm to pwm 255.
+ set_fan_value $hwmon_path ${fan_tach_path[$j]}
+ check_fail_flag=1
+ done
+ fi
+ current_fan_state=()
+ break
+ fi
+ current_fan_state=()
+ fi
+
+ #fans are going to normal.
+ if [ $i -eq $((${#fan_tach_path[@]}-1)) ] && [ $check_fail_flag -eq 1 ]; then
+ check_fail_flag=0
+ systemctl restart phosphor-pid-control
+ fi
+ done
+ sleep 2
+done
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend
deleted file mode 100644
index 72d991c7e..000000000
--- a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend
+++ /dev/null
@@ -1 +0,0 @@
-FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml
deleted file mode 100644
index 7efc2fefa..000000000
--- a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml
+++ /dev/null
@@ -1,751 +0,0 @@
-groups:
- - 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/fan4
- - name: water_and_air_cooled_zone0_fans
- description: Group of fan inventory objects for water/air cooled zone 0
- type: /xyz/openbmc_project/inventory
- members:
- - /system/chassis/motherboard/fan4
- - name: air_cooled_zone1_fans
- description: Group of fan inventory objects for air cooled zone 1
- type: /xyz/openbmc_project/inventory
- members:
- - /system/chassis/motherboard/fan5
- - name: air_cooled_zone2_fans
- description: Group of fan inventory objects for air cooled zone 2
- type: /xyz/openbmc_project/inventory
- members:
- - /system/chassis/motherboard/fan0
- - /system/chassis/motherboard/fan1
- - /system/chassis/motherboard/fan2
- - /system/chassis/motherboard/fan3
- - name: water_and_air_cooled_zone2_fans
- description: Group of fan inventory objects for water/air cooled zone 2
- type: /xyz/openbmc_project/inventory
- members:
- - /system/chassis/motherboard/fan0
- - name: zone2_ambient
- description: Group of ambient temperature sensors for zone 2
- type: /xyz/openbmc_project/sensors
- members:
- - /temperature/ambient
- - /temperature/cpu_1_ambient
- - /temperature/pcie
- - 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
- - name: zone1_cores
- description: Group of core temperature sensors for zone 1
- type: /xyz/openbmc_project/sensors
- members:
- - /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_regulators
- description: Group of regulator temperature sensors for zone 0
- type: /xyz/openbmc_project/sensors
- members:
- - /temperature/p0_vdd_temp
- - name: zone1_regulators
- description: Group of regulator temperature sensors for zone 1
- type: /xyz/openbmc_project/sensors
- members:
- - /temperature/p1_vdd_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
- - name: zone1_dimms
- description: Group of dimm temperature sensors for zone 1
- type: /xyz/openbmc_project/sensors
- members:
- - /temperature/dimm8_temp
- - /temperature/dimm9_temp
- - /temperature/dimm10_temp
- - /temperature/dimm11_temp
- - /temperature/dimm12_temp
- - /temperature/dimm13_temp
- - /temperature/dimm14_temp
- - /temperature/dimm15_temp
- - name: zone0_pcie
- description: Group of pcie temperature sensors for zone 0
- type: /xyz/openbmc_project/sensors
- members:
- - /temperature/pcie
-
-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: objectSignal
- - 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(s) for the given group
- parameters:
- - group
-
-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: run_pid_control
- description: >
- Runs PID control trying to keep value at property
- parameters:
- - property
- - integrator_timestep
- - kp
- - ki
- - kd
-
-events:
- - name: default_fan_floor_on_service_fail
- # No global zone conditions defined == all unless defined on group
- groups:
- - name: zone2_ambient
- interface: xyz.openbmc_project.Sensor.Value
- property:
- name: Value
- type: int64_t
- matches:
- - name: nameOwnerChanged
- actions:
- - name: call_actions_based_on_timer
- timer:
- delay: 5
- type: oneshot
- actions:
- - name: default_floor_on_missing_owner
- - name: missing_before_high_speed_air_zone0
- 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: propertiesChanged
- actions:
- - name: count_state_before_speed
- count: 1
- property:
- value: false
- type: bool
- speed:
- value: 1000
- type: uint64_t
- - name: missing_before_high_speed_air_zone1
- groups:
- - name: air_cooled_zone1_fans
- zone_conditions:
- - name: air_cooled_chassis
- zones:
- - 1
- interface: xyz.openbmc_project.Inventory.Item
- property:
- name: Present
- type: bool
- matches:
- - name: propertiesChanged
- actions:
- - name: count_state_before_speed
- count: 1
- property:
- value: false
- type: bool
- speed:
- value: 1000
- type: uint64_t
- - name: fails_before_high_speed_air_zone0
- 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: 1000
- type: uint64_t
- - name: fails_before_high_speed_air_zone1
- groups:
- - name: air_cooled_zone1_fans
- zone_conditions:
- - name: air_cooled_chassis
- zones:
- - 1
- 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: 1000
- type: uint64_t
- - name: missing_before_high_speed_water_and_air_zone0
- groups:
- - name: water_and_air_cooled_zone0_fans
- zone_conditions:
- - name: water_and_air_cooled_chassis
- zones:
- - 0
- interface: xyz.openbmc_project.Inventory.Item
- property:
- name: Present
- type: bool
- matches:
- - name: propertiesChanged
- actions:
- - name: count_state_before_speed
- count: 1
- property:
- value: false
- type: bool
- speed:
- value: 1000
- type: uint64_t
- - name: fails_before_high_speed_water_and_air_zone0
- groups:
- - name: water_and_air_cooled_zone0_fans
- zone_conditions:
- - name: water_and_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: 1000
- type: uint64_t
- - name: set_air_cooled_speed_boundaries_based_on_ambient
- groups:
- - name: zone2_ambient
- zone_conditions:
- - name: air_cooled_chassis
- zones:
- - 2
- 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:
- - 22000: 100
- type: std::map<int64_t, uint64_t>
- - name: set_ceiling_from_average_sensor_value
- map:
- value:
- - 27000: 1000
- type: std::map<int64_t, uint64_t>
- - name: set_water_cooled_speed_boundaries_based_on_ambient
- groups:
- - name: zone2_ambient
- zone_conditions:
- - name: water_and_air_cooled_chassis
- zones:
- - 2
- 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:
- - 22000: 250
- type: std::map<int64_t, uint64_t>
- - name: set_ceiling_from_average_sensor_value
- map:
- value:
- - 27000: 1000
- type: std::map<int64_t, uint64_t>
- - name: speed_changes_based_on_regulator_temps
- groups:
- - name: zone0_regulators
- zone_conditions:
- - name: air_cooled_chassis
- zones:
- - 0
- - name: water_and_air_cooled_chassis
- zones:
- - 0
- interface: xyz.openbmc_project.Sensor.Value
- property:
- name: Value
- type: int64_t
- matches:
- - name: interfacesAdded
- - name: propertiesChanged
- actions:
- - name: set_net_increase_speed
- property:
- value: 85000
- type: int64_t
- factor:
- value: 1000
- type: int64_t
- delta:
- value: 40
- type: uint64_t
- timer:
- interval: 5
- - name: occ_active_speed_changes_zone0
- precondition:
- name: property_states_match
- groups:
- - name: occ0_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_zone0
- 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
- actions:
- - name: run_pid_control
- property:
- value: 63000
- type: int64_t
- integrator_timestep:
- value: 1
- type: int64_t
- kp:
- value: 3500
- type: int64_t
- ki:
- value: 100
- type: int64_t
- kd:
- value: 0
- type: int64_t
- # Ensure PID values are always translated out to hardware
- # This do-nothing "speed increase" is always called on every loop invocation
- - name: set_net_increase_speed
- property:
- value: 0
- type: int64_t
- factor:
- value: 0
- type: int64_t
- delta:
- value: 0
- type: uint64_t
- timer:
- interval: 5
- - name: speed_changes_based_on_dimm_temps_zone0
- groups:
- - name: zone0_dimms
- zone_conditions:
- - name: air_cooled_chassis
- zones:
- - 0
- - name: water_and_air_cooled_chassis
- zones:
- - 0
- interface: xyz.openbmc_project.Sensor.Value
- property:
- name: Value
- type: int64_t
- matches:
- - name: interfacesAdded
- - name: propertiesChanged
- actions:
- - name: set_net_increase_speed
- property:
- value: 64000
- type: int64_t
- factor:
- value: 1000
- type: int64_t
- delta:
- value: 4
- type: uint64_t
- timer:
- interval: 5
- - name: occ_active_speed_changes_zone1
- precondition:
- name: property_states_match
- groups:
- - 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_zone1
- groups:
- - name: zone1_cores
- zone_conditions:
- - name: air_cooled_chassis
- zones:
- - 1
- interface: xyz.openbmc_project.Sensor.Value
- property:
- name: Value
- type: int64_t
- matches:
- - name: interfacesAdded
- - name: propertiesChanged
- actions:
- - name: run_pid_control
- property:
- value: 63001
- type: int64_t
- integrator_timestep:
- value: 1
- type: int64_t
- kp:
- value: 3500
- type: int64_t
- ki:
- value: 100
- type: int64_t
- kd:
- value: 0
- type: int64_t
- # Ensure PID values are always translated out to hardware
- # This do-nothing "speed increase" is always called on every loop invocation
- - name: set_net_increase_speed
- property:
- value: 0
- type: int64_t
- factor:
- value: 0
- type: int64_t
- delta:
- value: 0
- type: uint64_t
- timer:
- interval: 5
- - name: speed_changes_based_on_dimm_temps_zone1
- groups:
- - name: zone1_dimms
- zone_conditions:
- - name: air_cooled_chassis
- zones:
- - 1
- - name: water_and_air_cooled_chassis
- zones:
- - 2
- interface: xyz.openbmc_project.Sensor.Value
- property:
- name: Value
- type: int64_t
- matches:
- - name: interfacesAdded
- - name: propertiesChanged
- actions:
- - name: set_net_increase_speed
- property:
- value: 64000
- type: int64_t
- factor:
- value: 1000
- type: int64_t
- delta:
- value: 40
- type: uint64_t
- timer:
- interval: 5
- - name: occ_active_speed_changes_zone2
- precondition:
- name: property_states_match
- groups:
- - name: occ0_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_ambient_temp
- groups:
- - name: zone2_ambient
- zone_conditions:
- - name: air_cooled_chassis
- zones:
- - 2
- - name: water_and_air_cooled_chassis
- zones:
- - 2
- interface: xyz.openbmc_project.Sensor.Value
- property:
- name: Value
- type: int64_t
- matches:
- - name: interfacesAdded
- - name: propertiesChanged
- actions:
- - name: run_pid_control
- property:
- value: 42000
- type: int64_t
- integrator_timestep:
- value: 1
- type: int64_t
- kp:
- value: 2500
- type: int64_t
- ki:
- value: 50
- type: int64_t
- kd:
- value: 0
- type: int64_t
- # Ensure PID values are always translated out to hardware
- # This do-nothing "speed increase" is always called on every loop invocation
- - name: set_net_increase_speed
- property:
- value: 0
- type: int64_t
- factor:
- value: 0
- type: int64_t
- delta:
- value: 0
- type: uint64_t
- timer:
- interval: 5
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config-native/fans.yaml b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config-native/fans.yaml
index 5bda3ccdb..5bda3ccdb 100755..100644
--- a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config-native/fans.yaml
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config-native/fans.yaml
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml
deleted file mode 100644
index 588fed35c..000000000
--- a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml
+++ /dev/null
@@ -1,56 +0,0 @@
-manager_configuration:
- power_on_delay: 5
-
-zone_configuration:
-
-#Air cooled zones
-- zone_conditions:
- - name: air_cooled_chassis
-
- zones:
- - zone: 0
- cooling_profiles:
- - air
- - all
- full_speed: 1000
- default_floor: 100
- increase_delay: 5
- decrease_interval: 5
- - zone: 1
- cooling_profiles:
- - air
- - all
- full_speed: 1000
- default_floor: 100
- increase_delay: 5
- decrease_interval: 5
- - zone: 2
- cooling_profiles:
- - air
- - all
- full_speed: 1000
- default_floor: 100
- increase_delay: 5
- decrease_interval: 5
-
-#Water cooled zones
-- zone_conditions:
- - name: water_and_air_cooled_chassis
-
- zones:
- - zone: 0
- cooling_profiles:
- - water
- - all
- full_speed: 1000
- default_floor: 100
- increase_delay: 5
- decrease_interval: 5
- - zone: 2
- cooling_profiles:
- - water
- - all
- full_speed: 1000
- default_floor: 100
- increase_delay: 5
- decrease_interval: 5
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/config-base.json b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/config-base.json
new file mode 100644
index 000000000..742378849
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/config-base.json
@@ -0,0 +1,2190 @@
+{
+ "sensors" : [
+ {
+ "name": "fan0",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan0",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan0",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fan1",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan1",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan1",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fan2",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan2",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan2",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fan3",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan3",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan3",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fan4",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan4",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan4",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "fan5",
+ "type": "fan",
+ "readPath": "/xyz/openbmc_project/sensors/fan_tach/fan5",
+ "writePath": "/xyz/openbmc_project/sensors/fan_tach/fan5",
+ "min": 0,
+ "max": 255
+ },
+ {
+ "name": "p0_core0_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core1_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core1_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core2_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core2_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core3_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core3_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core4_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core4_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core5_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core5_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core6_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core6_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core7_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core7_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core8_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core8_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core9_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core9_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core10_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core10_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core11_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core11_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core12_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core12_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core13_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core13_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core14_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core14_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core15_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core15_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core16_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core16_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core17_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core17_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core18_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core18_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core19_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core19_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core20_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core20_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core21_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core21_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core22_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core22_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_core23_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_core23_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core0_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core1_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core1_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core2_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core2_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core3_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core3_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core4_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core4_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core5_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core5_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core6_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core6_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core7_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core7_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core8_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core8_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core9_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core9_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core10_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core10_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core11_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core11_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core12_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core12_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core13_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core13_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core14_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core14_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core15_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core15_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core16_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core16_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core17_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core17_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core18_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core18_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core19_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core19_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core20_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core20_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core21_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core21_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core22_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core22_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_core23_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_core23_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm0_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm0_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm1_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm1_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm2_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm2_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm3_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm3_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm4_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm4_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm5_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm5_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm6_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm6_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm7_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm7_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm8_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm8_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm9_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm9_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm10_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm10_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm11_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm11_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm12_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm12_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm13_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm13_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm14_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm14_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "dimm15_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/dimm15_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p0_vdd_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p0_vdd_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "p1_vdd_temp",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/p1_vdd_temp",
+ "writePath": "",
+ "ignoreDbusMinMax": false,
+ "timeout": 0
+ },
+ {
+ "name": "ambient",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/ambient",
+ "writePath": "",
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ },
+ {
+ "name": "cpu_1_ambient",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/cpu_1_ambient",
+ "writePath": "",
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ },
+ {
+ "name": "pcie",
+ "type": "temp",
+ "readPath": "/xyz/openbmc_project/sensors/temperature/pcie",
+ "writePath": "",
+ "ignoreDbusMinMax": true,
+ "timeout": 0
+ }
+ ],
+ "zones" : [
+ {
+ "id": 0,
+ "minThermalOutput": 0.0,
+ "failsafePercent": 100.0,
+ "pids": [
+ {
+ "name": "fan4",
+ "type": "fan",
+ "inputs": ["fan4"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "p0_core0_temp",
+ "type": "temp",
+ "inputs": ["p0_core0_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core1_temp",
+ "type": "temp",
+ "inputs": ["p0_core1_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core2_temp",
+ "type": "temp",
+ "inputs": ["p0_core2_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core3_temp",
+ "type": "temp",
+ "inputs": ["p0_core3_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core4_temp",
+ "type": "temp",
+ "inputs": ["p0_core4_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core5_temp",
+ "type": "temp",
+ "inputs": ["p0_core5_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core6_temp",
+ "type": "temp",
+ "inputs": ["p0_core6_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core7_temp",
+ "type": "temp",
+ "inputs": ["p0_core7_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core8_temp",
+ "type": "temp",
+ "inputs": ["p0_core8_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core9_temp",
+ "type": "temp",
+ "inputs": ["p0_core9_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core10_temp",
+ "type": "temp",
+ "inputs": ["p0_core10_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core11_temp",
+ "type": "temp",
+ "inputs": ["p0_core11_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core12_temp",
+ "type": "temp",
+ "inputs": ["p0_core12_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core13_temp",
+ "type": "temp",
+ "inputs": ["p0_core13_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core14_temp",
+ "type": "temp",
+ "inputs": ["p0_core14_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core15_temp",
+ "type": "temp",
+ "inputs": ["p0_core15_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core16_temp",
+ "type": "temp",
+ "inputs": ["p0_core16_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core17_temp",
+ "type": "temp",
+ "inputs": ["p0_core17_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core18_temp",
+ "type": "temp",
+ "inputs": ["p0_core18_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core19_temp",
+ "type": "temp",
+ "inputs": ["p0_core19_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core20_temp",
+ "type": "temp",
+ "inputs": ["p0_core20_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core21_temp",
+ "type": "temp",
+ "inputs": ["p0_core21_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core22_temp",
+ "type": "temp",
+ "inputs": ["p0_core22_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_core23_temp",
+ "type": "temp",
+ "inputs": ["p0_core23_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm0_temp",
+ "type": "temp",
+ "inputs": ["dimm0_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm1_temp",
+ "type": "temp",
+ "inputs": ["dimm1_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm2_temp",
+ "type": "temp",
+ "inputs": ["dimm2_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm3_temp",
+ "type": "temp",
+ "inputs": ["dimm3_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm4_temp",
+ "type": "temp",
+ "inputs": ["dimm4_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm5_temp",
+ "type": "temp",
+ "inputs": ["dimm5_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm6_temp",
+ "type": "temp",
+ "inputs": ["dimm6_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm7_temp",
+ "type": "temp",
+ "inputs": ["dimm7_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p0_vdd_temp",
+ "type": "temp",
+ "inputs": ["p0_vdd_temp"],
+ "setpoint": 85.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -40.0,
+ "integralCoeff": -2.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ }
+ ]
+ },
+ {
+ "id": 1,
+ "minThermalOutput": 0.0,
+ "failsafePercent": 100.0,
+ "pids": [
+ {
+ "name": "fan5",
+ "type": "fan",
+ "inputs": ["fan5"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "p1_core0_temp",
+ "type": "temp",
+ "inputs": ["p1_core0_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core1_temp",
+ "type": "temp",
+ "inputs": ["p1_core1_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core2_temp",
+ "type": "temp",
+ "inputs": ["p1_core2_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core3_temp",
+ "type": "temp",
+ "inputs": ["p1_core3_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core4_temp",
+ "type": "temp",
+ "inputs": ["p1_core4_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core5_temp",
+ "type": "temp",
+ "inputs": ["p1_core5_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core6_temp",
+ "type": "temp",
+ "inputs": ["p1_core6_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core7_temp",
+ "type": "temp",
+ "inputs": ["p1_core7_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core8_temp",
+ "type": "temp",
+ "inputs": ["p1_core8_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core9_temp",
+ "type": "temp",
+ "inputs": ["p1_core9_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core10_temp",
+ "type": "temp",
+ "inputs": ["p1_core10_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core11_temp",
+ "type": "temp",
+ "inputs": ["p1_core11_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core12_temp",
+ "type": "temp",
+ "inputs": ["p1_core12_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core13_temp",
+ "type": "temp",
+ "inputs": ["p1_core13_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core14_temp",
+ "type": "temp",
+ "inputs": ["p1_core14_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core15_temp",
+ "type": "temp",
+ "inputs": ["p1_core15_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core16_temp",
+ "type": "temp",
+ "inputs": ["p1_core16_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core17_temp",
+ "type": "temp",
+ "inputs": ["p1_core17_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core18_temp",
+ "type": "temp",
+ "inputs": ["p1_core18_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core19_temp",
+ "type": "temp",
+ "inputs": ["p1_core19_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core20_temp",
+ "type": "temp",
+ "inputs": ["p1_core20_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core21_temp",
+ "type": "temp",
+ "inputs": ["p1_core21_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core22_temp",
+ "type": "temp",
+ "inputs": ["p1_core22_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_core23_temp",
+ "type": "temp",
+ "inputs": ["p1_core23_temp"],
+ "setpoint": 63.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -3.5,
+ "integralCoeff": -0.1,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm8_temp",
+ "type": "temp",
+ "inputs": ["dimm8_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm9_temp",
+ "type": "temp",
+ "inputs": ["dimm9_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm10_temp",
+ "type": "temp",
+ "inputs": ["dimm10_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm11_temp",
+ "type": "temp",
+ "inputs": ["dimm11_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm12_temp",
+ "type": "temp",
+ "inputs": ["dimm12_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm13_temp",
+ "type": "temp",
+ "inputs": ["dimm13_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm14_temp",
+ "type": "temp",
+ "inputs": ["dimm14_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "dimm15_temp",
+ "type": "temp",
+ "inputs": ["dimm15_temp"],
+ "setpoint": 64.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -4.0,
+ "integralCoeff": -0.2,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "p1_vdd_temp",
+ "type": "temp",
+ "inputs": ["p1_vdd_temp"],
+ "setpoint": 85.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -40.0,
+ "integralCoeff": -2.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ }
+ ]
+ },
+ {
+ "id": 2,
+ "minThermalOutput": 0.0,
+ "failsafePercent": 100.0,
+ "pids": [
+ {
+ "name": "fan0",
+ "type": "fan",
+ "inputs": ["fan0"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "fan1",
+ "type": "fan",
+ "inputs": ["fan1"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "fan2",
+ "type": "fan",
+ "inputs": ["fan2"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "fan3",
+ "type": "fan",
+ "inputs": ["fan3"],
+ "setpoint": 0.0,
+ "pid": {
+ "samplePeriod": 0.1,
+ "proportionalCoeff": 0.0,
+ "integralCoeff": 0.0,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 1.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 0.0,
+ "outLim_min": 10.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0
+ }
+ },
+ {
+ "name": "ambient",
+ "type": "temp",
+ "inputs": ["ambient"],
+ "setpoint": 42.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -2.5,
+ "integralCoeff": -0.05,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "cpu_1_ambient",
+ "type": "temp",
+ "inputs": ["cpu_1_ambient"],
+ "setpoint": 42.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -2.5,
+ "integralCoeff": -0.05,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ },
+ {
+ "name": "pcie",
+ "type": "temp",
+ "inputs": ["pcie"],
+ "setpoint": 42.0,
+ "pid": {
+ "samplePeriod": 1.0,
+ "proportionalCoeff": -2.5,
+ "integralCoeff": -0.05,
+ "feedFwdOffsetCoeff": 0.0,
+ "feedFwdGainCoeff": 0.0,
+ "integralLimit_min": 0.0,
+ "integralLimit_max": 100.0,
+ "outLim_min": 0.0,
+ "outLim_max": 100.0,
+ "slewNeg": 0.0,
+ "slewPos": 0.0,
+ "positiveHysteresis": 1.0,
+ "negativeHysteresis": 1.0
+ }
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/continue-if-sensor-not-present.patch b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/continue-if-sensor-not-present.patch
new file mode 100644
index 000000000..7c384013a
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/continue-if-sensor-not-present.patch
@@ -0,0 +1,384 @@
+diff --git a/dbus/dbuspassive.cpp b/dbus/dbuspassive.cpp
+index 806ef40..75b83f5 100644
+--- a/dbus/dbuspassive.cpp
++++ b/dbus/dbuspassive.cpp
+@@ -26,6 +26,10 @@
+ #include <string>
+ #include <variant>
+
++using Property = std::string;
++using Value = std::variant<int64_t, double, std::string, bool>;
++using PropertyMap = std::map<Property, Value>;
++
+ std::unique_ptr<ReadInterface> DbusPassive::createDbusPassive(
+ sdbusplus::bus::bus& bus, const std::string& type, const std::string& id,
+ DbusHelperInterface* helper, const conf::SensorConfig* info,
+@@ -61,6 +65,41 @@ std::unique_ptr<ReadInterface> DbusPassive::createDbusPassive(
+ return nullptr;
+ }
+
++ if (failed && (type == "fan"))
++ {
++ std::string path = getInventoryPath(id);
++
++ try
++ {
++ bool present = true;
++
++ auto pimMsg = tempBus.new_method_call("xyz.openbmc_project.Inventory.Manager", path.c_str(), "org.freedesktop.DBus.Properties", "GetAll");
++ pimMsg.append("xyz.openbmc_project.Inventory.Item");
++
++ PropertyMap propMap;
++
++ auto valueResponseMsg = bus.call(pimMsg);
++ valueResponseMsg.read(propMap);
++
++ // If no error was set, the data should all be there.
++ auto findPresent = propMap.find("Present");
++ if (findPresent != propMap.end())
++ {
++ present = std::get<bool>(findPresent->second);
++ }
++
++ // std::cerr << "DbusPassive::createDbusPassive() present: '" << present << "'\n";
++ if (!present)
++ {
++ failed = false;
++ }
++ }
++ catch (const std::exception& e)
++ {
++ // Ignore failure
++ }
++ }
++
+ /* if these values are zero, they're ignored. */
+ if (info->ignoreDbusMinMax)
+ {
+@@ -68,6 +107,7 @@ std::unique_ptr<ReadInterface> DbusPassive::createDbusPassive(
+ settings.max = 0;
+ }
+
++ // std::cerr << "DbusPassive::createDbusPassive() failed: " << failed << "\n";
+ return std::make_unique<DbusPassive>(bus, type, id, helper, settings,
+ failed, path, redundancy);
+ }
+@@ -78,8 +118,9 @@ DbusPassive::DbusPassive(
+ bool failed, const std::string& path,
+ const std::shared_ptr<DbusPassiveRedundancy>& redundancy) :
+ ReadInterface(),
+- _bus(bus), _signal(bus, getMatch(type, id).c_str(), dbusHandleSignal, this),
+- _id(id), _helper(helper), _failed(failed), path(path),
++ _id(id), _type(type), _helper(helper), _bus(bus),
++ _signal(bus, getMatch(type, id).c_str(), dbusHandleSignal, this),
++ _failed(failed), path(path),
+ redundancy(redundancy)
+
+ {
+@@ -109,19 +150,23 @@ void DbusPassive::setValue(double value)
+
+ bool DbusPassive::getFailed(void) const
+ {
++ // std::cerr << "DbusPassive::getFailed() redundancy: " << redundancy << "\n";
+ if (redundancy)
+ {
+ const std::set<std::string>& failures = redundancy->getFailed();
+ if (failures.find(path) != failures.end())
+ {
++ // std::cerr << "DbusPassive::getFailed() redundancy has signalled failure!\n";
+ return true;
+ }
+ }
++ // std::cerr << "DbusPassive::getFailed() _failed: " << _failed << "\n";
+ return _failed;
+ }
+
+ void DbusPassive::setFailed(bool value)
+ {
++ // std::cerr << "DbusPassive::setFailed(" << value << ")\n";
+ _failed = value;
+ }
+
+@@ -189,6 +234,43 @@ int handleSensorValue(sdbusplus::message::message& msg, DbusPassive* owner)
+ {
+ asserted = std::get<bool>(criticalAlarmHigh->second);
+ }
++
++ // std::cerr << "handleSensorValue() asserted: " << asserted << " type: '" << owner->_type << "'\n";
++ if (asserted && (owner->_type == "fan"))
++ {
++ std::string path = getInventoryPath(owner->_id);
++
++ try
++ {
++ bool present = true;
++
++ auto pimMsg = owner->_bus.new_method_call("xyz.openbmc_project.Inventory.Manager", path.c_str(), "org.freedesktop.DBus.Properties", "GetAll");
++ pimMsg.append("xyz.openbmc_project.Inventory.Item");
++
++ PropertyMap propMap;
++
++ auto valueResponseMsg = owner->_bus.call(pimMsg);
++ valueResponseMsg.read(propMap);
++
++ // If no error was set, the data should all be there.
++ auto findPresent = propMap.find("Present");
++ if (findPresent != propMap.end())
++ {
++ present = std::get<bool>(findPresent->second);
++ }
++
++ // std::cerr << "handleSensorValue() present: '" << present << "'\n";
++ if (!present)
++ {
++ asserted = false;
++ }
++ }
++ catch (const std::exception& e)
++ {
++ // Ignore failure
++ }
++ }
++
+ owner->setFailed(asserted);
+ }
+
+diff --git a/dbus/dbuspassive.hpp b/dbus/dbuspassive.hpp
+index f00a2ea..d025ed4 100644
+--- a/dbus/dbuspassive.hpp
++++ b/dbus/dbuspassive.hpp
+@@ -57,12 +57,14 @@ class DbusPassive : public ReadInterface
+ double getMax(void);
+ double getMin(void);
+
+- private:
++ std::string _id; // for debug identification
++ std::string _type; // for inventory match
++ DbusHelperInterface* _helper;
+ sdbusplus::bus::bus& _bus;
++
++ private:
+ sdbusplus::server::match::match _signal;
+ int64_t _scale;
+- std::string _id; // for debug identification
+- DbusHelperInterface* _helper;
+
+ std::mutex _lock;
+ double _value = 0;
+diff --git a/dbus/dbuswrite.cpp b/dbus/dbuswrite.cpp
+index 502b988..28a04e4 100644
+--- a/dbus/dbuswrite.cpp
++++ b/dbus/dbuswrite.cpp
+@@ -65,6 +65,8 @@ void DbusWritePercent::write(double value)
+ "org.freedesktop.DBus.Properties", "Set");
+ mesg.append(pwmInterface, "Target", std::variant<uint64_t>(ovalue));
+
++ // std::cerr << "DbusWritePercent::write(" << value << "), writing to connection '" << connectionName.c_str() << "', path '" << path.c_str() << "' xyz.openbmc_project.Control.FanPwm Target '" << ovalue << "'\n";
++
+ try
+ {
+ // TODO: if we don't use the reply, call_noreply()
+@@ -111,6 +113,8 @@ void DbusWrite::write(double value)
+ "org.freedesktop.DBus.Properties", "Set");
+ mesg.append(pwmInterface, "Target", std::variant<uint64_t>(value));
+
++ // std::cerr << "DbusWrite::write(" << value << "), writing to connection '" << connectionName.c_str() << "', path '" << path.c_str() << "' xyz.openbmc_project.Control.FanPwm Target '" << value << "'\n";
++
+ try
+ {
+ // TODO: consider call_noreplly
+diff --git a/dbus/util.cpp b/dbus/util.cpp
+index 33e0985..8a639eb 100644
+--- a/dbus/util.cpp
++++ b/dbus/util.cpp
+@@ -148,6 +148,7 @@ bool DbusHelper::thresholdsAsserted(sdbusplus::bus::bus& bus,
+ {
+ asserted = std::get<bool>(findCriticalHigh->second);
+ }
++ // std::cerr << "DbusHelper::thresholdsAsserted path: '" << path << "' asserted: " << asserted << "\n";
+ return asserted;
+ }
+
+@@ -170,6 +171,11 @@ std::string getSensorPath(const std::string& type, const std::string& id)
+ return std::string("/xyz/openbmc_project/sensors/" + layer + "/" + id);
+ }
+
++std::string getInventoryPath(const std::string& id)
++{
++ return std::string("/xyz/openbmc_project/inventory/system/chassis/motherboard/" + id);
++}
++
+ std::string getMatch(const std::string& type, const std::string& id)
+ {
+ return std::string("type='signal',"
+diff --git a/pid/ec/pid.cpp b/pid/ec/pid.cpp
+index 7d8b403..7a8b91d 100644
+--- a/pid/ec/pid.cpp
++++ b/pid/ec/pid.cpp
+@@ -16,6 +16,8 @@
+
+ #include "pid.hpp"
+
++#include <iostream>
++
+ namespace ec
+ {
+
+@@ -72,6 +74,8 @@ double pid(pid_info_t* pidinfoptr, double input, double setpoint)
+ output = proportionalTerm + integralTerm + feedFwdTerm;
+ output = clamp(output, pidinfoptr->outLim.min, pidinfoptr->outLim.max);
+
++ // std::cerr << "pid() input: " << input << " error: " << error << " proportionalTerm: " << proportionalTerm << " integralTerm: " << integralTerm << " feedFwdTerm: " << feedFwdTerm << " output: " << output << "\n";
++
+ // slew rate
+ // TODO(aarena) - Simplify logic as Andy suggested by creating dynamic
+ // outLim_min/max that are affected by slew rate control and just clamping
+diff --git a/pid/fancontroller.cpp b/pid/fancontroller.cpp
+index dd26d16..3a2c743 100644
+--- a/pid/fancontroller.cpp
++++ b/pid/fancontroller.cpp
+@@ -106,6 +106,7 @@ double FanController::setptProc(void)
+ setFanDirection(FanSpeedDirection::NEUTRAL);
+ }
+
++ // std::cerr << "FanController::setptProc() prev: " << prev << " going to return: " << maxRPM << "\n";
+ setSetpoint(maxRPM);
+
+ return (maxRPM);
+@@ -128,12 +129,15 @@ void FanController::outputProc(double value)
+ }
+ }
+
++ // std::cerr << "FanController::outputProc(" << value << ") _owner->getFailSafeMode(): " << _owner->getFailSafeMode() << " percent: " << percent << "\n";
++
+ // value and kFanFailSafeDutyCycle are 10 for 10% so let's fix that.
+ percent /= 100;
+
+ // PidSensorMap for writing.
+ for (const auto& it : _inputs)
+ {
++ // std::cerr << "FanController::outputProc(" << value << ") for '" << it << "', writing value '" << percent << "'\n";
+ auto sensor = _owner->getSensor(it);
+ sensor->write(percent);
+ }
+diff --git a/pid/pidcontroller.cpp b/pid/pidcontroller.cpp
+index e3eaaff..e23149e 100644
+--- a/pid/pidcontroller.cpp
++++ b/pid/pidcontroller.cpp
+@@ -73,6 +73,8 @@ void PIDController::process(void)
+ output = ec::pid(info, lastInput, setpt);
+ }
+
++ // std::cerr << "PIDController::process() setpt: " << setpt << " input: " << input << " output: " << output << "\n";
++
+ // Output new value
+ outputProc(output);
+
+diff --git a/pid/zone.cpp b/pid/zone.cpp
+index 6a63671..8cdb9f7 100644
+--- a/pid/zone.cpp
++++ b/pid/zone.cpp
+@@ -53,6 +53,11 @@ void PIDZone::setManualMode(bool mode)
+ bool PIDZone::getFailSafeMode(void) const
+ {
+ // If any keys are present at least one sensor is in fail safe mode.
++ // if (!_failSafeSensors.empty())
++ // {
++ // std::set<std::string>::iterator it = _failSafeSensors.begin();
++ // std::cerr << "PIDZone::getFailSafeMode sensor '" << *it << "' failed!\n";
++ // }
+ return !_failSafeSensors.empty();
+ }
+
+@@ -139,6 +144,7 @@ void PIDZone::determineMaxSetPointRequest(void)
+ */
+ max = std::max(getMinThermalSetpoint(), max);
+
++ // std::cerr << "PIDZone::determineMaxSetPointRequest _SetPoints.size(): " << _SetPoints.size() << " tuningEnabled: " << tuningEnabled << " max: " << max << "\n";
+ if (tuningEnabled)
+ {
+ /*
+@@ -251,6 +257,7 @@ void PIDZone::updateFanTelemetry(void)
+ // check if fan fail.
+ if (sensor->getFailed())
+ {
++ std::cerr << "Fan '" << f << "' has failed!.\n";
+ _failSafeSensors.insert(f);
+ }
+ else if (timeout != 0 && duration >= period)
+@@ -288,6 +295,17 @@ void PIDZone::updateSensors(void)
+ for (const auto& t : _thermalInputs)
+ {
+ auto sensor = _mgr.getSensor(t);
++ if (!sensor)
++ {
++ // std::cerr << "Skipping missing sensor '" << t << "'.\n";
++ // Check if it's in there: remove it.
++ auto kt = _failSafeSensors.find(t);
++ if (kt != _failSafeSensors.end())
++ {
++ _failSafeSensors.erase(kt);
++ }
++ continue;
++ }
+ ReadReturn r = sensor->read();
+ int64_t timeout = sensor->getTimeout();
+
+@@ -303,7 +321,7 @@ void PIDZone::updateSensors(void)
+ }
+ else if (timeout != 0 && duration >= period)
+ {
+- // std::cerr << "Entering fail safe mode.\n";
++ std::cerr << "Entering fail safe mode.\n";
+ _failSafeSensors.insert(t);
+ }
+ else
+@@ -315,6 +333,8 @@ void PIDZone::updateSensors(void)
+ _failSafeSensors.erase(kt);
+ }
+ }
++
++ // std::cerr << "PIDZone::updateSensors for '" << t << "', got value '" << _cachedValuesByName[t] << "'\n";
+ }
+
+ return;
+diff --git a/sensors/builder.cpp b/sensors/builder.cpp
+index 4da1cf2..464ec9c 100644
+--- a/sensors/builder.cpp
++++ b/sensors/builder.cpp
+@@ -87,9 +87,7 @@ SensorManager
+ }
+ if (ri == nullptr)
+ {
+- throw SensorBuildException(
+- "Failed to create dbus passive sensor: " + name +
+- " of type: " + info->type);
++ continue;
+ }
+ break;
+ case IOInterfaceType::EXTERNAL:
+diff --git a/sensors/manager.hpp b/sensors/manager.hpp
+index 411b302..bd1dd48 100644
+--- a/sensors/manager.hpp
++++ b/sensors/manager.hpp
+@@ -38,6 +38,8 @@ class SensorManager
+ // TODO(venture): Should implement read/write by name.
+ Sensor* getSensor(const std::string& name) const
+ {
++ if (_sensorMap.count(name) <= 0)
++ return nullptr;
+ return _sensorMap.at(name).get();
+ }
+
+diff --git a/util.hpp b/util.hpp
+index e40b61f..5e2feae 100644
+--- a/util.hpp
++++ b/util.hpp
+@@ -149,6 +149,7 @@ class DbusHelper : public DbusHelperInterface
+ };
+
+ std::string getSensorPath(const std::string& type, const std::string& id);
++std::string getInventoryPath(const std::string& id);
+ std::string getMatch(const std::string& type, const std::string& id);
+ void scaleSensorReading(const double min, const double max, double& value);
+ bool validType(const std::string& type);
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-boot-control.service b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-boot-control.service
new file mode 100644
index 000000000..2149c3da5
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-boot-control.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Set Fan to Default Duty as Booting Up
+DefaultDependencies=no
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/fan-default-speed.sh
+
+[Install]
+WantedBy=sysinit.target
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-control.sh b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-control.sh
new file mode 100644
index 000000000..87d41a8b1
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-control.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+FAN_TABLE_PATH="/usr/share/swampd/config.json"
+FAN_TABLE_BASE="/usr/share/swampd/config-base.json"
+
+# System specific tweaks go here!
+# <TWEAK>
+
+cp $FAN_TABLE_BASE $FAN_TABLE_PATH
+
+# start pid control
+/usr/bin/swampd
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh
new file mode 100644
index 000000000..95b92e37a
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh
@@ -0,0 +1,21 @@
+#!bin/bash
+
+# set fan pwm by d-bus command
+function set_fan_value() {
+ # Failsafe
+ echo 255 > /sys/class/hwmon/*/pwm1
+
+ # DBUS interface
+ set_property_path='xyz.openbmc_project.Control.FanPwm'
+ busctl set-property $1 $2 $set_property_path Target t 255
+}
+
+# WARNING
+# This makes a number of assumptions about the bus structure underlying the fan controllers...
+hwmon_path="$(mapper get-service /xyz/openbmc_project/sensors/fan_tach/fan0)"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan0" "/sys/class/hwmon/*/pwm1"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan1" "/sys/class/hwmon/*/pwm2"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan2" "/sys/class/hwmon/*/pwm3"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan3" "/sys/class/hwmon/*/pwm4"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan4" "/sys/class/hwmon/*/pwm5"
+set_fan_value $hwmon_path "/xyz/openbmc_project/sensors/fan_tach/fan5" "/sys/class/hwmon/*/pwm6"
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service
new file mode 100644
index 000000000..681bdbe00
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Set Fan to Default Duty as Rebooting
+DefaultDependencies=no
+After=shutdown.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=true
+ExecStart=/usr/bin/fan-default-speed.sh
+
+[Install]
+WantedBy=shutdown.target
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service
new file mode 100644
index 000000000..0e18819f8
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=OpenBMC Fan Control Daemon
+After=xyz.openbmc_project.nvme.manager.service
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/fan-control.sh
+Restart=always
+RestartSec=5
+StartLimitInterval=0
+ExecStopPost=/usr/bin/fan-default-speed.sh
+
+[Install]
+WantedBy=basic.target
diff --git a/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control_%.bbappend b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control_%.bbappend
new file mode 100644
index 000000000..c29220949
--- /dev/null
+++ b/meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control_%.bbappend
@@ -0,0 +1,37 @@
+FILESEXTRAPATHS_prepend_talos := "${THISDIR}/${PN}:"
+SRC_URI_append_talos = " file://continue-if-sensor-not-present.patch"
+SRC_URI_append_talos = " file://config-base.json"
+SRC_URI_append_talos = " file://fan-control.sh"
+SRC_URI_append_talos = " file://fan-default-speed.sh"
+SRC_URI_append_talos = " file://phosphor-pid-control.service"
+SRC_URI_append_talos = " file://fan-reboot-control.service"
+SRC_URI_append_talos = " file://fan-boot-control.service"
+
+FILES_${PN}_append_talos = " ${datadir}/swampd/config-base.json"
+FILES_${PN}_append_talos = " ${bindir}/fan-control.sh"
+FILES_${PN}_append_talos = " ${bindir}/fan-default-speed.sh"
+
+inherit systemd
+RDEPENDS_${PN} += "bash"
+
+SYSTEMD_SERVICE_${PN}_append_talos = " phosphor-pid-control.service"
+SYSTEMD_SERVICE_${PN}_append_talos = " fan-reboot-control.service"
+SYSTEMD_SERVICE_${PN}_append_talos = " fan-boot-control.service"
+
+do_install_append_talos() {
+ install -d ${D}/${bindir}
+ install -m 0755 ${WORKDIR}/fan-control.sh ${D}/${bindir}
+ install -m 0755 ${WORKDIR}/fan-default-speed.sh ${D}/${bindir}
+
+ install -d ${D}${datadir}/swampd
+ install -m 0644 -D ${WORKDIR}/config-base.json \
+ ${D}${datadir}/swampd/config-base.json
+
+ install -d ${D}${systemd_unitdir}/system/
+ install -m 0644 ${WORKDIR}/phosphor-pid-control.service \
+ ${D}${systemd_unitdir}/system
+ install -m 0644 ${WORKDIR}/fan-reboot-control.service \
+ ${D}${systemd_unitdir}/system
+ install -m 0644 ${WORKDIR}/fan-boot-control.service \
+ ${D}${systemd_unitdir}/system
+}
diff --git a/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/bus@1e78a000/i2c-bus@440/max31785@52.conf b/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/bus@1e78a000/i2c-bus@440/max31785@52.conf
index 8b0f3cbc7..80838e70d 100644
--- a/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/bus@1e78a000/i2c-bus@440/max31785@52.conf
+++ b/meta-rcs/meta-talos/recipes-phosphor/sensors/phosphor-hwmon/obmc/hwmon/ahb/apb/bus@1e78a000/i2c-bus@440/max31785@52.conf
@@ -39,6 +39,3 @@ CRITHI_fan3 = "30000"
CRITHI_fan4 = "30000"
CRITHI_fan5 = "30000"
CRITHI_fan6 = "30000"
-
-# Legacy mode
-TARGET_MODE = "RPM"
diff --git a/meta-rcs/recipes-phosphor/image/obmc-phosphor-image.bbappend b/meta-rcs/recipes-phosphor/image/obmc-phosphor-image.bbappend
index a8f40301f..3ec99df8e 100644
--- a/meta-rcs/recipes-phosphor/image/obmc-phosphor-image.bbappend
+++ b/meta-rcs/recipes-phosphor/image/obmc-phosphor-image.bbappend
@@ -2,5 +2,7 @@ OBMC_IMAGE_EXTRA_INSTALL_append = "\
phosphor-nslcd-cert-config \
phosphor-nslcd-authority-cert-config \
phosphor-fan \
+ phosphor-pid-control \
+ detect-fan-fail \
phosphor-hwmon \
"
OpenPOWER on IntegriCloud