platform/x86/amd/pmf: Add facility to dump TA inputs
authorShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Tue, 12 Dec 2023 01:47:03 +0000 (07:17 +0530)
committerHans de Goede <hdegoede@redhat.com>
Mon, 18 Dec 2023 11:47:49 +0000 (12:47 +0100)
PMF driver sends constant inputs to TA which its gets via the other
subsystems in the kernel. To debug certain TA issues knowing what inputs
being sent to TA becomes critical. Add debug facility to the driver which
can isolate Smart PC and TA related issues.

Also, make source_as_str() as non-static function as this helper is
required outside of sps.c file.

Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Link: https://lore.kernel.org/r/20231212014705.2017474-11-Shyam-sundar.S-k@amd.com
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
drivers/platform/x86/amd/pmf/pmf.h
drivers/platform/x86/amd/pmf/spc.c
drivers/platform/x86/amd/pmf/tee-if.c

index 25e369477f863690fa0b3cc0a0ce365094d4523e..55cd2b301bbb4fc962524a2703dd33a56ad5f2bb 100644 (file)
@@ -602,6 +602,7 @@ bool is_pprof_balanced(struct amd_pmf_dev *pmf);
 int amd_pmf_power_slider_update_event(struct amd_pmf_dev *dev);
 const char *amd_pmf_source_as_str(unsigned int state);
 
+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);
@@ -632,4 +633,6 @@ int apmf_check_smart_pc(struct amd_pmf_dev *pmf_dev);
 
 /* Smart PC - TA interfaces */
 void amd_pmf_populate_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
+void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in);
+
 #endif /* PMF_H */
index 351efcbe83c4276c20bfdd5ec02008b5c6aa6ed9..a0423942f771e457457cc88cb604913eeb5b2657 100644 (file)
 #include <linux/units.h>
 #include "pmf.h"
 
+#ifdef CONFIG_AMD_PMF_DEBUG
+static const char *ta_slider_as_str(unsigned int state)
+{
+       switch (state) {
+       case TA_BEST_PERFORMANCE:
+               return "PERFORMANCE";
+       case TA_BETTER_PERFORMANCE:
+               return "BALANCED";
+       case TA_BEST_BATTERY:
+               return "POWER_SAVER";
+       default:
+               return "Unknown TA Slider State";
+       }
+}
+
+void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in)
+{
+       dev_dbg(dev->dev, "==== TA inputs START ====\n");
+       dev_dbg(dev->dev, "Slider State: %s\n", ta_slider_as_str(in->ev_info.power_slider));
+       dev_dbg(dev->dev, "Power Source: %s\n", amd_pmf_source_as_str(in->ev_info.power_source));
+       dev_dbg(dev->dev, "Battery Percentage: %u\n", in->ev_info.bat_percentage);
+       dev_dbg(dev->dev, "Designed Battery Capacity: %u\n", in->ev_info.bat_design);
+       dev_dbg(dev->dev, "Fully Charged Capacity: %u\n", in->ev_info.full_charge_capacity);
+       dev_dbg(dev->dev, "Drain Rate: %d\n", in->ev_info.drain_rate);
+       dev_dbg(dev->dev, "Socket Power: %u\n", in->ev_info.socket_power);
+       dev_dbg(dev->dev, "Skin Temperature: %u\n", in->ev_info.skin_temperature);
+       dev_dbg(dev->dev, "Avg C0 Residency: %u\n", in->ev_info.avg_c0residency);
+       dev_dbg(dev->dev, "Max C0 Residency: %u\n", in->ev_info.max_c0residency);
+       dev_dbg(dev->dev, "GFX Busy: %u\n", in->ev_info.gfx_busy);
+       dev_dbg(dev->dev, "LID State: %s\n", in->ev_info.lid_state ? "close" : "open");
+       dev_dbg(dev->dev, "==== TA inputs END ====\n");
+}
+#else
+void amd_pmf_dump_ta_inputs(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in) {}
+#endif
+
 static void amd_pmf_get_smu_info(struct amd_pmf_dev *dev, struct ta_pmf_enact_table *in)
 {
        u16 max, avg = 0;
index 8811631c7be507af1c36bc4adba639ff68f531da..38b75198cc3f4cb7aeca54fcfcc4e9ed5e6fbb57 100644 (file)
@@ -182,6 +182,7 @@ static int amd_pmf_invoke_cmd_enact(struct amd_pmf_dev *dev)
        }
 
        if (ta_sm->pmf_result == TA_PMF_TYPE_SUCCESS && out->actions_count) {
+               amd_pmf_dump_ta_inputs(dev, in);
                dev_dbg(dev->dev, "action count:%u result:%x\n", out->actions_count,
                        ta_sm->pmf_result);
                amd_pmf_apply_policies(dev, out);