Hi All, On 2/29/2024 13:02, Shyam Sundar S K wrote: > 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. > > Co-developed-by: Patil Rajesh Reddy <Patil.Reddy@xxxxxxx> > Signed-off-by: Patil Rajesh Reddy <Patil.Reddy@xxxxxxx> > Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@xxxxxxx> > --- > drivers/platform/x86/amd/pmf/acpi.c | 10 ++++++ > drivers/platform/x86/amd/pmf/pmf.h | 25 +++++++++++++ > drivers/platform/x86/amd/pmf/sps.c | 56 ++++++++++++++++++++++++++++- > 3 files changed, 90 insertions(+), 1 deletion(-) > > diff --git a/drivers/platform/x86/amd/pmf/acpi.c b/drivers/platform/x86/amd/pmf/acpi.c > index f0360eea81e6..82dafe74fc6d 100644 > --- a/drivers/platform/x86/amd/pmf/acpi.c > +++ b/drivers/platform/x86/amd/pmf/acpi.c > @@ -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) > { > diff --git a/drivers/platform/x86/amd/pmf/pmf.h b/drivers/platform/x86/amd/pmf/pmf.h > index 5cad11369697..e1bcd9e80ab9 100644 > --- a/drivers/platform/x86/amd/pmf/pmf.h > +++ b/drivers/platform/x86/amd/pmf/pmf.h > @@ -85,6 +85,7 @@ > #define MAX_OPERATION_PARAMS 4 > > #define PMF_IF_V1 1 > +#define PMF_IF_V2 2 > > struct sbios_hb_event_v2 { > u16 size; > @@ -224,6 +225,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; > @@ -264,6 +273,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; > @@ -285,6 +298,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; > @@ -634,6 +657,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); > diff --git a/drivers/platform/x86/amd/pmf/sps.c b/drivers/platform/x86/amd/pmf/sps.c > index 33e23e25c8b1..e4bf685269bd 100644 > --- a/drivers/platform/x86/amd/pmf/sps.c > +++ b/drivers/platform/x86/amd/pmf/sps.c > @@ -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 (mode) { Apologies. I did not enable CONFIG_AMD_PMF_DEBUG while sending out this series and hence there is a build error with parameter names state/mode. will do a resend. Thanks, Shyam > + 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);