Name Date Size #Lines LOC

..Today-

buildjson/H10-Nov-2022-9557

dbus/H10-Dec-2024-2,7802,048

errors/H07-Mar-2021-5241

examples/H12-Dec-2022-252238

experiments/H10-Nov-2022-282180

ipmi/H10-Dec-2024-480298

notimpl/H11-May-2023-11252

pid/H22-Oct-2024-3,6252,412

sensors/H04-Sep-2024-943589

subprojects/H10-Dec-2023-4231

sysfs/H15-Jul-2023-236122

test/H10-Dec-2024-4,0352,922

tools/H21-Apr-2023-14394

.clang-formatH A D20-Dec-20243.7 KiB137135

.clang-tidyH A D20-Dec-2024328 2419

.gitignoreH A D14-Jul-202342 43

.lcovrcH A D07-Mar-202180 43

.shellcheckH A D14-Apr-20210

LICENSEH A D07-Mar-202111.1 KiB202169

OWNERSH A D20-Dec-20241.6 KiB4944

README.mdH A D22-Oct-20246.5 KiB163117

conf.hppH A D05-Feb-20242.6 KiB10054

configure.mdH A D22-Oct-202418.3 KiB377300

interfaces.hppH A D05-Jun-20232 KiB9356

ipmi.mdH A D22-Oct-20243.8 KiB7759

main.cppH A D04-Sep-202411.5 KiB417311

meson.buildH A D14-Jun-20244.3 KiB169149

meson.optionsH A D14-Jun-2024719 76

phosphor-pid-control.service.inH A D12-Oct-2022286 1512

setsensor.cppH A D10-Nov-20222.5 KiB9573

swampd_diagram.pngH A D07-Mar-202119.5 KiB

tuning.mdH A D22-Oct-20243 KiB7755

util.cppH A D26-Oct-20235.6 KiB170130

util.hppH A D26-Oct-20231.8 KiB6634

README.md

1# phosphor-pid-control
2
3This is a daemon running within the OpenBMC environment. It uses a well-defined
4configuration file to control the temperature of the tray components to keep
5them within operating conditions. It may require coordination with host-side
6tooling and OpenBMC.
7
8## Overview
9
10The BMC will run a daemon that controls the fans by pre-defined zones. The
11application will use thermal control, such that each defined zone is kept within
12a range and adjusted based on thermal information provided from locally readable
13sensors as well as host-provided information over an IPMI OEM command.
14
15A system (or tray) will be broken out into one or more zones, specified via
16configuration files or dbus. Each zone will contain at least one fan and at
17least one temperature sensor and some device margins. The sensor data can be
18provided via sysfs, dbus, or through IPMI. In either case, default margins
19should be provided in case of failure or other unknown situation.
20
21The system will run a control loop for each zone with the attempt to maintain
22the temperature within that zone within the margin for the devices specified.
23
24## Configuring
25
26[How to configure phosphor-pid-control](configure.md)
27
28## Detailed Design
29
30The software will run as a multi-threaded daemon that runs a control loop for
31each zone, and has a master thread which listens for dbus messages. Each zone
32will require at least one fan that it exclusively controls, however, zones can
33share temperature sensors.
34
35![Swampd Architecture](swampd_diagram.png "Swampd Architecture")
36
37In this figure the communications channels between swampd and ipmid and
38phosphor-hwmon are laid out.
39
40### Zone Specification
41
42A configuration file will need to exist for each board.
43
44Each zone must have at least one fan that it exclusively controls. Each zone
45must have at least one temperature sensor, but they may be shared.
46
47The internal thermometers specified can be read via sysfs or dbus.
48
49### Chassis Delta
50
51Due to data center requirements, the delta between the outgoing air temperature
52and the environmental air temperature must be no greater than 15C.
53
54### IPMI Access to Phosphor-pid-control
55
56[OEM-IPMI Definitions](ipmi.md)
57
58#### Set Sensor Value
59
60Tools needs to update the thermal controller with information not necessarily
61available to the BMC. This will comprise of a list of temperature (or margin?)
62sensors that are updated by the set sensor command. Because they don't represent
63real sensors in the system, the set sensor handler can simply broadcast the
64update as a properties update on dbus when it receives the command over IPMI.
65
66#### Set Fan PWM
67
68A tool can override a specific fan's PWM when we implement the set sensor IPMI
69command pathway.
70
71#### Get Fan Tach
72
73A tool can read fan_tach through the normal IPMI interface presently exported
74for sensors.
75
76### Sensor Update Loop
77
78The plan is to listen for fan_tach updates for each fan in a background thread.
79This will receive an update from phosphor-hwmon each time it updates any sensor
80it cares about.
81
82By default phosphor-hwmon reads each sensor in turn and then sleeps for 1
83second. We'll be updating phosphor-hwmon to sleep for a shorter period -- how
84short though is still TBD. We'll also be updating phosphor-hwmon to support pwm
85as a target.
86
87### Thermal Control Loops
88
89Each zone will require a control loop that monitors the associated thermals and
90controls the fan(s). The EC PID loop is designed to hit the fans 10 times per
91second to drive them to the desired value and read the sensors once per second.
92We'll be receiving sensor updates with such regularly, however, at present it
93takes ~0.13s to read all 8 fans. Which can't be read constantly without bringing
94the system to its knees -- in that all CPU cycles would be spent reading the
95fans. TBD on how frequently we'll be reading the fan sensors and the impact this
96will have.
97
98### Main Thread
99
100The main thread will manage the other threads, and process the initial
101configuration files. It will also register a dbus handler for the OEM message.
102
103### Enabling Logging & Tuning
104
105By default, swampd won't log information. To enable logging pass "-l" on the
106command line with a parameter that is the folder into which to write the logs.
107
108The log files will be named `{folderpath}/zone_{zoneid}.log`.
109
110To enable tuning, pass "-t" on the command line.
111
112See [Logging & Tuning](tuning.md) for more information.
113
114## Code Layout
115
116The code is broken out into modules as follows:
117
118- `dbus` - Any read or write interface that uses dbus primarily.
119- `experiments` - Small execution paths that allow for fan examination including
120  how quickly fans respond to changes.
121- `ipmi` - Manual control for any zone is handled by receiving an IPMI message.
122  This holds the ipmid provider for receiving those messages and sending them
123  onto swampd.
124- `notimpl` - These are read-only and write-only interface implementations that
125  can be dropped into a pluggable sensor to make it complete.
126- `pid` - This contains all the PID associated code, including the zone
127  definition, controller definition, and the PID computational code.
128- `scripts` - This contains the scripts that convert YAML into C++.
129- `sensors` - This contains a couple of sensor types including the pluggable
130  sensor's definition. It also holds the sensor manager.
131- `sysfs` - This contains code that reads from or writes to sysfs.
132- `threads` - Most of swampd's threads run in this method where there's just a
133  dbus bus that we manage.
134
135## Example System Configurations
136
137### Two Margin Sensors Into Three Fans (Non-Step PID)
138
139A single zone system where multiple margin thermal sensors are fed into one PID
140that generates the output RPM for a set of fans controlled by one PID.
141
142margin sensors as input to thermal pid
143
144```text
145fleeting0+---->+-------+    +-------+     Thermal PID sampled
146               |  min()+--->+  PID  |     slower rate.
147fleeting1+---->+-------+    +---+---+
148                                |
149                                |
150                                | RPM setpoint
151                    Current RPM v
152                             +--+-----+
153  The Fan PID        fan0+--->        |  New PWM  +-->fan0
154  samples at a               |        |           |
155  faster rate        fan1+--->  PID   +---------->--->fan1
156  speeding up the            |        |           |
157  fans.              fan2+--->        |           +-->fan2
158                       ^     +--------+                +
159                       |                               |
160                       +-------------------------------+
161                              RPM updated by PWM.
162```
163