diff options
author | Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> | 2022-02-11 15:27:42 -0800 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2022-02-25 20:49:29 +0100 |
commit | bea2d9868ef553e376480de3cd84a7a06fb03e41 (patch) | |
tree | fe882734bda538c25dc009161309f72173ce19c0 /drivers/acpi/fan.h | |
parent | d445571fa369cf08148dcd9bce563d5fae14fcd7 (diff) | |
download | linux-stable-bea2d9868ef553e376480de3cd84a7a06fb03e41.tar.gz linux-stable-bea2d9868ef553e376480de3cd84a7a06fb03e41.tar.bz2 linux-stable-bea2d9868ef553e376480de3cd84a7a06fb03e41.zip |
ACPI: fan: Properly handle fine grain control
When _FIF object specifies support for fine grain control, then fan speed
can be set from 0 to 100% with the recommended minimum "step size" via
_FSL object. Here the control value doesn't need to match any value from
_FPS object.
Currently we have a simple solution implemented which just pick maximum
control value from _FPS to display the actual state, but this is not
optimal when there is a big window between two control values in
_FPS. Also there is no way to set to any speed which doesn't match
control values in _FPS. The system firmware can start the fan at speed
which doesn't match any control value.
To support fine grain control (when supported) via thermal sysfs:
- cooling device max state is not _FPS state count but it will be
100 / _FIF.step_size
Step size can be from 1 to 9.
- cooling device current state is _FST.control / _FIF.step_size
- cooling device set state will set the control value
cdev.curr_state * _FIF.step_size plus any adjustment for 100%.
By the spec, when control value do not sum to 100% because of
_FIF.step_size, OSPM may select an appropriate ending Level increment
to reach 100%.
There is no rounding during calculation. For example if step size
is 6:
thermal sysfs cooling device max_state = 100/6 = 16
So user can set any value from 0-16.
If the system boots with a _FST.control which is not multiples
of step_size, the thermal sysfs cur_state will be based on the
range. For example for step size = 6:
_FST.control thermal sysfs cur_state
------------------------------------------------
0-5 0
6-11 1
..
..
90-95 15
96-100 16
While setting the _FST.control, the compensation will be at
the last step for cur_state = 16, which will set the _FST.control
to 100.
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/fan.h')
-rw-r--r-- | drivers/acpi/fan.h | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/acpi/fan.h b/drivers/acpi/fan.h index 6cbb4b028da0..4c01be2e3b77 100644 --- a/drivers/acpi/fan.h +++ b/drivers/acpi/fan.h @@ -36,6 +36,12 @@ struct acpi_fan_fif { u8 low_speed_notification; }; +struct acpi_fan_fst { + u64 revision; + u64 control; + u64 speed; +}; + struct acpi_fan { bool acpi4; struct acpi_fan_fif fif; |