mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 23:21:31 +00:00
bea2d9868e
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>
56 lines
1.1 KiB
C
56 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
/*
|
|
* ACPI fan device IDs are shared between the fan driver and the device power
|
|
* management code.
|
|
*
|
|
* Add new device IDs before the generic ACPI fan one.
|
|
*/
|
|
|
|
#ifndef _ACPI_FAN_H_
|
|
#define _ACPI_FAN_H_
|
|
|
|
#define ACPI_FAN_DEVICE_IDS \
|
|
{"INT3404", }, /* Fan */ \
|
|
{"INTC1044", }, /* Fan for Tiger Lake generation */ \
|
|
{"INTC1048", }, /* Fan for Alder Lake generation */ \
|
|
{"INTC10A2", }, /* Fan for Raptor Lake generation */ \
|
|
{"PNP0C0B", } /* Generic ACPI fan */
|
|
|
|
#define ACPI_FPS_NAME_LEN 20
|
|
|
|
struct acpi_fan_fps {
|
|
u64 control;
|
|
u64 trip_point;
|
|
u64 speed;
|
|
u64 noise_level;
|
|
u64 power;
|
|
char name[ACPI_FPS_NAME_LEN];
|
|
struct device_attribute dev_attr;
|
|
};
|
|
|
|
struct acpi_fan_fif {
|
|
u8 revision;
|
|
u8 fine_grain_ctrl;
|
|
u8 step_size;
|
|
u8 low_speed_notification;
|
|
};
|
|
|
|
struct acpi_fan_fst {
|
|
u64 revision;
|
|
u64 control;
|
|
u64 speed;
|
|
};
|
|
|
|
struct acpi_fan {
|
|
bool acpi4;
|
|
struct acpi_fan_fif fif;
|
|
struct acpi_fan_fps *fps;
|
|
int fps_count;
|
|
struct thermal_cooling_device *cdev;
|
|
};
|
|
|
|
int acpi_fan_create_attributes(struct acpi_device *device);
|
|
void acpi_fan_delete_attributes(struct acpi_device *device);
|
|
#endif
|