mirror of
https://github.com/torvalds/linux.git
synced 2026-09-28 03:52:02 +02:00
platform/x86: hp-wmi: Introduce board-specific feature data
The hp_wmi DMI table is about to carry more than thermal-profile data. Replace the direct thermal_profile_params .driver_data pointers with hp_wmi_board_params and rename the table/setup helper accordingly. No functional changes intended. Signed-off-by: Radhey Kalra <radheykalra901@gmail.com> Link: https://patch.msgid.link/20260615091034.987029-2-radheykalra901@gmail.com Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
This commit is contained in:
parent
32763779b5
commit
08ecf6d131
|
|
@ -133,11 +133,35 @@ static const struct thermal_profile_params omen_v1_no_ec_thermal_params = {
|
|||
.ec_tp_offset = HP_NO_THERMAL_PROFILE_OFFSET,
|
||||
};
|
||||
|
||||
/*
|
||||
* A generic pointer for the currently-active board's thermal profile
|
||||
* parameters.
|
||||
*/
|
||||
static struct thermal_profile_params *active_thermal_profile_params;
|
||||
struct hp_wmi_board_params {
|
||||
const struct thermal_profile_params *thermal_profile;
|
||||
};
|
||||
|
||||
static const struct hp_wmi_board_params victus_s_board_params = {
|
||||
.thermal_profile = &victus_s_thermal_params,
|
||||
};
|
||||
|
||||
static const struct hp_wmi_board_params omen_v1_board_params = {
|
||||
.thermal_profile = &omen_v1_thermal_params,
|
||||
};
|
||||
|
||||
static const struct hp_wmi_board_params omen_v1_legacy_board_params = {
|
||||
.thermal_profile = &omen_v1_legacy_thermal_params,
|
||||
};
|
||||
|
||||
static const struct hp_wmi_board_params omen_v1_no_ec_board_params = {
|
||||
.thermal_profile = &omen_v1_no_ec_thermal_params,
|
||||
};
|
||||
|
||||
static const struct hp_wmi_board_params *active_board_params;
|
||||
|
||||
static const struct thermal_profile_params *hp_wmi_thermal_profile(void)
|
||||
{
|
||||
if (!active_board_params)
|
||||
return NULL;
|
||||
|
||||
return active_board_params->thermal_profile;
|
||||
}
|
||||
|
||||
/* DMI board names of devices that should use the omen specific path for
|
||||
* thermal profiles.
|
||||
|
|
@ -187,87 +211,87 @@ static const char * const victus_thermal_profile_boards[] = {
|
|||
"8A25",
|
||||
};
|
||||
|
||||
/* DMI Board names of Victus 16-r and Victus 16-s laptops */
|
||||
static const struct dmi_system_id victus_s_thermal_profile_boards[] __initconst = {
|
||||
/* DMI board-specific feature data for Omen and Victus laptops. */
|
||||
static const struct dmi_system_id hp_wmi_feature_boards[] __initconst = {
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8902") },
|
||||
.driver_data = (void *)&omen_v1_legacy_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_legacy_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8A44") },
|
||||
.driver_data = (void *)&omen_v1_legacy_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_legacy_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8A4D") },
|
||||
.driver_data = (void *)&omen_v1_legacy_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_legacy_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BAB") },
|
||||
.driver_data = (void *)&omen_v1_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8B2F") },
|
||||
.driver_data = (void *)&victus_s_thermal_params,
|
||||
.driver_data = (void *)&victus_s_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BBE") },
|
||||
.driver_data = (void *)&victus_s_thermal_params,
|
||||
.driver_data = (void *)&victus_s_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BC2") },
|
||||
.driver_data = (void *)&omen_v1_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BCA") },
|
||||
.driver_data = (void *)&omen_v1_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BCD") },
|
||||
.driver_data = (void *)&omen_v1_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BD4") },
|
||||
.driver_data = (void *)&victus_s_thermal_params,
|
||||
.driver_data = (void *)&victus_s_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BD5") },
|
||||
.driver_data = (void *)&victus_s_thermal_params,
|
||||
.driver_data = (void *)&victus_s_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8C76") },
|
||||
.driver_data = (void *)&omen_v1_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8C77") },
|
||||
.driver_data = (void *)&omen_v1_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8C78") },
|
||||
.driver_data = (void *)&omen_v1_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8C99") },
|
||||
.driver_data = (void *)&victus_s_thermal_params,
|
||||
.driver_data = (void *)&victus_s_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8C9C") },
|
||||
.driver_data = (void *)&victus_s_thermal_params,
|
||||
.driver_data = (void *)&victus_s_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8D26") },
|
||||
.driver_data = (void *)&omen_v1_legacy_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_legacy_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8D41") },
|
||||
.driver_data = (void *)&omen_v1_no_ec_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_no_ec_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8D87") },
|
||||
.driver_data = (void *)&omen_v1_no_ec_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_no_ec_board_params,
|
||||
},
|
||||
{
|
||||
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8E35") },
|
||||
.driver_data = (void *)&omen_v1_legacy_thermal_params,
|
||||
.driver_data = (void *)&omen_v1_legacy_board_params,
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
|
@ -1874,7 +1898,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
|
|||
u8 current_dstate, current_gpu_slowdown_temp, tp;
|
||||
const struct thermal_profile_params *params;
|
||||
|
||||
params = active_thermal_profile_params;
|
||||
params = hp_wmi_thermal_profile();
|
||||
if (!params)
|
||||
return -ENODEV;
|
||||
|
||||
if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
|
||||
params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
|
||||
*profile = active_platform_profile;
|
||||
|
|
@ -1886,10 +1913,10 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
|
|||
return ret;
|
||||
|
||||
/*
|
||||
* We cannot use active_thermal_profile_params here, because boards
|
||||
* like 8C78 have tp == 0x0 || tp == 0x1 after cold boot, but logically
|
||||
* it should have tp == 0x30 || tp == 0x31, as corrected by the Omen
|
||||
* Gaming Hub on windows. Hence accept both of these values.
|
||||
* Boards like 8C78 have tp == 0x0 || tp == 0x1 after cold boot,
|
||||
* but logically it should have tp == 0x30 || tp == 0x31, as
|
||||
* corrected by the Omen Gaming Hub on windows. Hence accept both
|
||||
* of these values.
|
||||
*/
|
||||
if (tp == victus_s_thermal_params.performance ||
|
||||
tp == omen_v1_thermal_params.performance) {
|
||||
|
|
@ -1924,12 +1951,12 @@ static int platform_profile_victus_s_get_ec(enum platform_profile_option *profil
|
|||
|
||||
static int platform_profile_victus_s_set_ec(enum platform_profile_option profile)
|
||||
{
|
||||
struct thermal_profile_params *params;
|
||||
const struct thermal_profile_params *params;
|
||||
bool gpu_ctgp_enable, gpu_ppab_enable;
|
||||
u8 gpu_dstate; /* Test shows 1 = 100%, 2 = 50%, 3 = 25%, 4 = 12.5% */
|
||||
int err, tp;
|
||||
|
||||
params = active_thermal_profile_params;
|
||||
params = hp_wmi_thermal_profile();
|
||||
if (!params)
|
||||
return -ENODEV;
|
||||
|
||||
|
|
@ -2195,6 +2222,7 @@ static const struct platform_profile_ops hp_wmi_platform_profile_ops = {
|
|||
static int thermal_profile_setup(struct platform_device *device)
|
||||
{
|
||||
const struct platform_profile_ops *ops;
|
||||
const struct thermal_profile_params *params;
|
||||
int err, tp;
|
||||
|
||||
if (is_omen_thermal_profile()) {
|
||||
|
|
@ -2226,13 +2254,17 @@ static int thermal_profile_setup(struct platform_device *device)
|
|||
|
||||
ops = &platform_profile_victus_ops;
|
||||
} else if (is_victus_s_thermal_profile()) {
|
||||
params = hp_wmi_thermal_profile();
|
||||
if (!params)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* For an unknown EC layout board, platform_profile_victus_s_get_ec(),
|
||||
* behaves like a wrapper around active_platform_profile, to avoid using
|
||||
* uninitialized data, we default to PLATFORM_PROFILE_BALANCED.
|
||||
*/
|
||||
if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
|
||||
active_thermal_profile_params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
|
||||
if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN ||
|
||||
params->ec_tp_offset == HP_NO_THERMAL_PROFILE_OFFSET) {
|
||||
active_platform_profile = PLATFORM_PROFILE_BALANCED;
|
||||
} else {
|
||||
err = platform_profile_victus_s_get_ec(&active_platform_profile);
|
||||
|
|
@ -2693,24 +2725,25 @@ static int hp_wmi_hwmon_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void __init setup_active_thermal_profile_params(void)
|
||||
static void __init setup_active_board_params(void)
|
||||
{
|
||||
const struct dmi_system_id *id;
|
||||
const struct thermal_profile_params *params;
|
||||
|
||||
/*
|
||||
* Currently only victus_s devices use the
|
||||
* active_thermal_profile_params
|
||||
*/
|
||||
id = dmi_first_match(victus_s_thermal_profile_boards);
|
||||
id = dmi_first_match(hp_wmi_feature_boards);
|
||||
if (id) {
|
||||
active_board_params = id->driver_data;
|
||||
params = hp_wmi_thermal_profile();
|
||||
if (!params)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Marking this boolean is required to ensure that
|
||||
* is_victus_s_thermal_profile() behaves like a valid
|
||||
* wrapper.
|
||||
*/
|
||||
is_victus_s_board = true;
|
||||
active_thermal_profile_params = id->driver_data;
|
||||
if (active_thermal_profile_params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN) {
|
||||
if (params->ec_tp_offset == HP_EC_OFFSET_UNKNOWN) {
|
||||
pr_warn("Unknown EC layout for board %s. Thermal profile readback will be disabled. Please report this to platform-driver-x86@vger.kernel.org\n",
|
||||
dmi_get_system_info(DMI_BOARD_NAME));
|
||||
}
|
||||
|
|
@ -2745,10 +2778,10 @@ static int __init hp_wmi_init(void)
|
|||
}
|
||||
|
||||
/*
|
||||
* Setup active board's thermal profile parameters before
|
||||
* starting platform driver probe.
|
||||
* Setup active board feature data before starting platform
|
||||
* driver probe.
|
||||
*/
|
||||
setup_active_thermal_profile_params();
|
||||
setup_active_board_params();
|
||||
err = platform_driver_probe(&hp_wmi_driver, hp_wmi_bios_setup);
|
||||
if (err)
|
||||
goto err_unregister_device;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user