platform/x86/amd/pmf: Add support to get APTS index numbers for static slider
authorShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Wed, 6 Mar 2024 11:44:13 +0000 (17:14 +0530)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Tue, 12 Mar 2024 10:48:30 +0000 (12:48 +0200)
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>
drivers/platform/x86/amd/pmf/acpi.c
drivers/platform/x86/amd/pmf/pmf.h
drivers/platform/x86/amd/pmf/sps.c

index f0360eea81e6ae99c51d8a216b96c4fcb4b322cd..82dafe74fc6d44938b407b16310f6530986161e7 100644 (file)
@@ -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)
 {
index bcd1ae71109e8f08dcf5da4a56ce2a257434759a..44ac22098d790ea609ad847dda498bf829e58fe0 100644 (file)
@@ -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);
index 33e23e25c8b1efe6c2c032ecdcbfdb6672949128..0cf38bdae7a47d27d671bd09091d01811973ecfa 100644 (file)
 
 #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);