Commit a3281ec5 authored by Shyam Sundar S K's avatar Shyam Sundar S K Committed by Hans de Goede

platform/x86/amd/pmf: Add fan control support

PMF has a generic interface defined via PMF ACPI fn9 for influencing fan
policy during mode switch.

PMF ACPI fn9 will normally be invoked when AMDPMF needs to change the fan
table index for the EC. When AMDPMF is loaded this function will be invoked
to change fan speed. OEM can also choose to report the actual fan table
index and fan RPM to PMF through OEM structure.

This information will be communicated by PMF driver to customer BIOS.
Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Link: https://lore.kernel.org/r/20220802151149.2123699-7-Shyam-sundar.S-k@amd.comSigned-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent b9ab888b
...@@ -119,6 +119,31 @@ static void apmf_sbios_heartbeat_notify(struct work_struct *work) ...@@ -119,6 +119,31 @@ static void apmf_sbios_heartbeat_notify(struct work_struct *work)
kfree(info); kfree(info);
} }
int apmf_update_fan_idx(struct amd_pmf_dev *pdev, bool manual, u32 idx)
{
union acpi_object *info;
struct apmf_fan_idx args;
struct acpi_buffer params;
int err = 0;
args.size = sizeof(args);
args.fan_ctl_mode = manual;
args.fan_ctl_idx = idx;
params.length = sizeof(args);
params.pointer = (void *)&args;
info = apmf_if_call(pdev, APMF_FUNC_SET_FAN_IDX, &params);
if (!info) {
err = -EIO;
goto out;
}
out:
kfree(info);
return err;
}
static int apmf_if_verify_interface(struct amd_pmf_dev *pdev) static int apmf_if_verify_interface(struct amd_pmf_dev *pdev)
{ {
struct apmf_verify_interface output; struct apmf_verify_interface output;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#define APMF_FUNC_VERIFY_INTERFACE 0 #define APMF_FUNC_VERIFY_INTERFACE 0
#define APMF_FUNC_GET_SYS_PARAMS 1 #define APMF_FUNC_GET_SYS_PARAMS 1
#define APMF_FUNC_SBIOS_HEARTBEAT 4 #define APMF_FUNC_SBIOS_HEARTBEAT 4
#define APMF_FUNC_SET_FAN_IDX 7
#define APMF_FUNC_STATIC_SLIDER_GRANULAR 9 #define APMF_FUNC_STATIC_SLIDER_GRANULAR 9
/* Message Definitions */ /* Message Definitions */
...@@ -39,6 +40,9 @@ ...@@ -39,6 +40,9 @@
#define GET_STT_LIMIT_APU 0x20 #define GET_STT_LIMIT_APU 0x20
#define GET_STT_LIMIT_HS2 0x21 #define GET_STT_LIMIT_HS2 0x21
/* Fan Index for Auto Mode */
#define FAN_INDEX_AUTO 0xFFFFFFFF
#define ARG_NONE 0 #define ARG_NONE 0
/* AMD PMF BIOS interfaces */ /* AMD PMF BIOS interfaces */
...@@ -57,6 +61,12 @@ struct apmf_system_params { ...@@ -57,6 +61,12 @@ struct apmf_system_params {
u32 heartbeat_int; u32 heartbeat_int;
} __packed; } __packed;
struct apmf_fan_idx {
u16 size;
u8 fan_ctl_mode;
u32 fan_ctl_idx;
} __packed;
enum amd_stt_skin_temp { enum amd_stt_skin_temp {
STT_TEMP_APU, STT_TEMP_APU,
STT_TEMP_HS2, STT_TEMP_HS2,
...@@ -118,6 +128,11 @@ struct amd_pmf_static_slider_granular { ...@@ -118,6 +128,11 @@ struct amd_pmf_static_slider_granular {
struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX][POWER_MODE_MAX]; struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX][POWER_MODE_MAX];
}; };
struct fan_table_control {
bool manual;
unsigned long fan_id;
};
/* Core Layer */ /* Core Layer */
int apmf_acpi_init(struct amd_pmf_dev *pmf_dev); int apmf_acpi_init(struct amd_pmf_dev *pmf_dev);
void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev); void apmf_acpi_deinit(struct amd_pmf_dev *pmf_dev);
...@@ -135,4 +150,5 @@ int apmf_get_static_slider_granular(struct amd_pmf_dev *pdev, ...@@ -135,4 +150,5 @@ int apmf_get_static_slider_granular(struct amd_pmf_dev *pdev,
struct apmf_static_slider_granular_output *output); struct apmf_static_slider_granular_output *output);
int apmf_update_fan_idx(struct amd_pmf_dev *pdev, bool manual, u32 idx);
#endif /* PMF_H */ #endif /* PMF_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment