Srinivas Pandruvada bea2d9868e 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>
2022-02-25 20:49:29 +01:00
..
2022-02-07 17:42:44 +01:00
2022-01-23 06:20:44 +02:00
2022-01-11 11:35:28 -08:00
2022-01-12 11:11:34 -08:00
2022-01-22 08:33:37 +02:00
2022-01-22 09:52:17 +02:00
2022-02-15 09:05:01 -08:00
2022-01-16 08:08:11 +02:00
2022-02-02 10:33:04 +05:30
2022-01-22 08:33:37 +02:00
2022-01-20 13:25:01 +02:00
2022-01-27 11:23:26 +02:00
2022-02-18 09:20:52 -08:00
2022-02-01 12:39:37 -08:00
2022-02-08 09:48:44 +01:00
2021-12-29 10:54:50 +01:00
2022-01-20 13:31:46 +02:00
2022-01-23 06:20:44 +02:00
2022-01-17 08:07:57 +02:00
2022-01-22 08:33:37 +02:00