mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-07 14:32:23 +00:00
platform/x86/amd/pmf: Add support to get APTS index numbers for static slider
APMF spec has a newer section called the APTS (AMD Performance and Thermal State) information, where each slider/power mode is associated with an index number. Add support to get these indices for the Static Slider. Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Co-developed-by: Patil Rajesh Reddy <Patil.Reddy@amd.com> Signed-off-by: Patil Rajesh Reddy <Patil.Reddy@amd.com> Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> Link: https://lore.kernel.org/r/20240306114415.3267603-6-Shyam-sundar.S-k@amd.com Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
This commit is contained in:
parent
6262938eef
commit
48d38f5692
@ -96,6 +96,16 @@ int is_apmf_func_supported(struct amd_pmf_dev *pdev, unsigned long index)
|
||||
return !!(pdev->supported_func & BIT(index - 1));
|
||||
}
|
||||
|
||||
int apmf_get_static_slider_granular_v2(struct amd_pmf_dev *pdev,
|
||||
struct apmf_static_slider_granular_output_v2 *data)
|
||||
{
|
||||
if (!is_apmf_func_supported(pdev, APMF_FUNC_STATIC_SLIDER_GRANULAR))
|
||||
return -EINVAL;
|
||||
|
||||
return apmf_if_call_store_buffer(pdev, APMF_FUNC_STATIC_SLIDER_GRANULAR,
|
||||
data, sizeof(*data));
|
||||
}
|
||||
|
||||
int apmf_get_static_slider_granular(struct amd_pmf_dev *pdev,
|
||||
struct apmf_static_slider_granular_output *data)
|
||||
{
|
||||
|
@ -89,6 +89,7 @@ struct cookie_header {
|
||||
#define MAX_OPERATION_PARAMS 4
|
||||
|
||||
#define PMF_IF_V1 1
|
||||
#define PMF_IF_V2 2
|
||||
|
||||
struct sbios_hb_event_v2 {
|
||||
u16 size;
|
||||
@ -228,6 +229,14 @@ enum power_modes {
|
||||
POWER_MODE_MAX,
|
||||
};
|
||||
|
||||
enum power_modes_v2 {
|
||||
POWER_MODE_BEST_PERFORMANCE,
|
||||
POWER_MODE_BALANCED,
|
||||
POWER_MODE_BEST_POWER_EFFICIENCY,
|
||||
POWER_MODE_ENERGY_SAVE,
|
||||
POWER_MODE_V2_MAX,
|
||||
};
|
||||
|
||||
struct amd_pmf_dev {
|
||||
void __iomem *regbase;
|
||||
void __iomem *smu_virt_addr;
|
||||
@ -268,6 +277,10 @@ struct amd_pmf_dev {
|
||||
u16 pmf_if_version;
|
||||
};
|
||||
|
||||
struct apmf_sps_prop_granular_v2 {
|
||||
u8 power_states[POWER_SOURCE_MAX][POWER_MODE_V2_MAX];
|
||||
} __packed;
|
||||
|
||||
struct apmf_sps_prop_granular {
|
||||
u32 fppt;
|
||||
u32 sppt;
|
||||
@ -289,6 +302,16 @@ struct amd_pmf_static_slider_granular {
|
||||
struct apmf_sps_prop_granular prop[POWER_SOURCE_MAX][POWER_MODE_MAX];
|
||||
};
|
||||
|
||||
struct apmf_static_slider_granular_output_v2 {
|
||||
u16 size;
|
||||
struct apmf_sps_prop_granular_v2 sps_idx;
|
||||
} __packed;
|
||||
|
||||
struct amd_pmf_static_slider_granular_v2 {
|
||||
u16 size;
|
||||
struct apmf_sps_prop_granular_v2 sps_idx;
|
||||
};
|
||||
|
||||
struct os_power_slider {
|
||||
u16 size;
|
||||
u8 slider_event;
|
||||
@ -643,6 +666,8 @@ const char *amd_pmf_source_as_str(unsigned int state);
|
||||
|
||||
int apmf_update_fan_idx(struct amd_pmf_dev *pdev, bool manual, u32 idx);
|
||||
int amd_pmf_set_sps_power_limits(struct amd_pmf_dev *pmf);
|
||||
int apmf_get_static_slider_granular_v2(struct amd_pmf_dev *dev,
|
||||
struct apmf_static_slider_granular_output_v2 *data);
|
||||
|
||||
/* Auto Mode Layer */
|
||||
int apmf_get_auto_mode_def(struct amd_pmf_dev *pdev, struct apmf_auto_mode *data);
|
||||
|
@ -10,9 +10,26 @@
|
||||
|
||||
#include "pmf.h"
|
||||
|
||||
static struct amd_pmf_static_slider_granular_v2 config_store_v2;
|
||||
static struct amd_pmf_static_slider_granular config_store;
|
||||
|
||||
#ifdef CONFIG_AMD_PMF_DEBUG
|
||||
static const char *slider_v2_as_str(unsigned int state)
|
||||
{
|
||||
switch (state) {
|
||||
case POWER_MODE_BEST_PERFORMANCE:
|
||||
return "Best Performance";
|
||||
case POWER_MODE_BALANCED:
|
||||
return "Balanced";
|
||||
case POWER_MODE_BEST_POWER_EFFICIENCY:
|
||||
return "Best Power Efficiency";
|
||||
case POWER_MODE_ENERGY_SAVE:
|
||||
return "Energy Save";
|
||||
default:
|
||||
return "Unknown Power Mode";
|
||||
}
|
||||
}
|
||||
|
||||
static const char *slider_as_str(unsigned int state)
|
||||
{
|
||||
switch (state) {
|
||||
@ -63,10 +80,44 @@ static void amd_pmf_dump_sps_defaults(struct amd_pmf_static_slider_granular *dat
|
||||
|
||||
pr_debug("Static Slider Data - END\n");
|
||||
}
|
||||
|
||||
static void amd_pmf_dump_sps_defaults_v2(struct amd_pmf_static_slider_granular_v2 *data)
|
||||
{
|
||||
unsigned int i, j;
|
||||
|
||||
pr_debug("Static Slider APTS state index data - BEGIN");
|
||||
pr_debug("size: %u\n", data->size);
|
||||
|
||||
for (i = 0; i < POWER_SOURCE_MAX; i++)
|
||||
for (j = 0; j < POWER_MODE_V2_MAX; j++)
|
||||
pr_debug("%s %s: %u\n", amd_pmf_source_as_str(i), slider_v2_as_str(j),
|
||||
data->sps_idx.power_states[i][j]);
|
||||
|
||||
pr_debug("Static Slider APTS state index data - END\n");
|
||||
}
|
||||
#else
|
||||
static void amd_pmf_dump_sps_defaults(struct amd_pmf_static_slider_granular *data) {}
|
||||
static void amd_pmf_dump_sps_defaults_v2(struct amd_pmf_static_slider_granular_v2 *data) {}
|
||||
#endif
|
||||
|
||||
static void amd_pmf_load_defaults_sps_v2(struct amd_pmf_dev *dev)
|
||||
{
|
||||
struct apmf_static_slider_granular_output_v2 output;
|
||||
unsigned int i, j;
|
||||
|
||||
memset(&config_store_v2, 0, sizeof(config_store_v2));
|
||||
apmf_get_static_slider_granular_v2(dev, &output);
|
||||
|
||||
config_store_v2.size = output.size;
|
||||
|
||||
for (i = 0; i < POWER_SOURCE_MAX; i++)
|
||||
for (j = 0; j < POWER_MODE_V2_MAX; j++)
|
||||
config_store_v2.sps_idx.power_states[i][j] =
|
||||
output.sps_idx.power_states[i][j];
|
||||
|
||||
amd_pmf_dump_sps_defaults_v2(&config_store_v2);
|
||||
}
|
||||
|
||||
static void amd_pmf_load_defaults_sps(struct amd_pmf_dev *dev)
|
||||
{
|
||||
struct apmf_static_slider_granular_output output;
|
||||
@ -256,7 +307,10 @@ int amd_pmf_init_sps(struct amd_pmf_dev *dev)
|
||||
dev->current_profile = PLATFORM_PROFILE_BALANCED;
|
||||
|
||||
if (is_apmf_func_supported(dev, APMF_FUNC_STATIC_SLIDER_GRANULAR)) {
|
||||
amd_pmf_load_defaults_sps(dev);
|
||||
if (dev->pmf_if_version == PMF_IF_V2)
|
||||
amd_pmf_load_defaults_sps_v2(dev);
|
||||
else
|
||||
amd_pmf_load_defaults_sps(dev);
|
||||
|
||||
/* update SPS balanced power mode thermals */
|
||||
amd_pmf_set_sps_power_limits(dev);
|
||||
|
Loading…
Reference in New Issue
Block a user