From bc0ca9464ea7b062ac9432d9d03e72acae2078d0 Mon Sep 17 00:00:00 2001 From: Raptor Engineering Development Team Date: Sun, 16 Feb 2020 20:56:49 +0000 Subject: 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. --- .../occ/openpower-occ-control/occ-active.sh | 4 +- .../packagegroups/packagegroup-op-apps.bb | 1 - meta-rcs/meta-talos/conf/machine/talos.conf | 11 +- .../recipes-phosphor/fans/detect-fan-fail.bb | 26 + .../fans/detect-fan-fail/detect-fan-fail.service | 11 + .../fans/detect-fan-fail/detect-fan-fail.sh | 60 + ...sphor-fan-control-events-config-native.bbappend | 1 - .../events.yaml | 751 ------- .../fans.yaml | 0 .../zones.yaml | 56 - .../fans/phosphor-pid-control/config-base.json | 2190 ++++++++++++++++++++ .../continue-if-sensor-not-present.patch | 384 ++++ .../phosphor-pid-control/fan-boot-control.service | 10 + .../fans/phosphor-pid-control/fan-control.sh | 12 + .../fans/phosphor-pid-control/fan-default-speed.sh | 21 + .../fan-reboot-control.service | 12 + .../phosphor-pid-control.service | 14 + .../fans/phosphor-pid-control_%.bbappend | 37 + .../apb/bus@1e78a000/i2c-bus@440/max31785@52.conf | 3 - .../image/obmc-phosphor-image.bbappend | 2 + 20 files changed, 2791 insertions(+), 815 deletions(-) create mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail.bb create mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail/detect-fan-fail.service create mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/detect-fan-fail/detect-fan-fail.sh delete mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native.bbappend delete mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-events-config-native/events.yaml mode change 100755 => 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-fan-config-native/fans.yaml delete mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-fan-control-zone-config-native/zones.yaml create mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/config-base.json create mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/continue-if-sensor-not-present.patch create mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-boot-control.service create mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-control.sh create mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-default-speed.sh create mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/fan-reboot-control.service create mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control/phosphor-pid-control.service create mode 100644 meta-rcs/meta-talos/recipes-phosphor/fans/phosphor-pid-control_%.bbappend 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 - - name: set_ceiling_from_average_sensor_value - map: - value: - - 27000: 1000 - type: std::map - - 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 - - name: set_ceiling_from_average_sensor_value - map: - value: - - 27000: 1000 - type: std::map - - 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 old mode 100755 new mode 100644 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 + #include + ++using Property = std::string; ++using Value = std::variant; ++using PropertyMap = std::map; ++ + std::unique_ptr 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 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(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 DbusPassive::createDbusPassive( + settings.max = 0; + } + ++ // std::cerr << "DbusPassive::createDbusPassive() failed: " << failed << "\n"; + return std::make_unique(bus, type, id, helper, settings, + failed, path, redundancy); + } +@@ -78,8 +118,9 @@ DbusPassive::DbusPassive( + bool failed, const std::string& path, + const std::shared_ptr& 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& 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(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(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(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(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(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 ++ + 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::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! +# + +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 \ " -- cgit v1.2.1