On Fri, 22 Sep 2023, Shyam Sundar S K wrote: > 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. > > Reviewed-by: Mario Limonciello <mario.limonciello@xxxxxxx> > Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@xxxxxxx> > --- > drivers/platform/x86/amd/pmf/pmf.h | 3 +++ > drivers/platform/x86/amd/pmf/spc.c | 37 +++++++++++++++++++++++++++ > drivers/platform/x86/amd/pmf/sps.c | 2 +- > drivers/platform/x86/amd/pmf/tee-if.c | 1 + > 4 files changed, 42 insertions(+), 1 deletion(-) > > diff --git a/drivers/platform/x86/amd/pmf/pmf.h b/drivers/platform/x86/amd/pmf/pmf.h > index c5334f1177a4..61a0f3225b62 100644 > --- a/drivers/platform/x86/amd/pmf/pmf.h > +++ b/drivers/platform/x86/amd/pmf/pmf.h > @@ -592,6 +592,7 @@ int apmf_get_static_slider_granular(struct amd_pmf_dev *pdev, > bool is_pprof_balanced(struct amd_pmf_dev *pmf); > int amd_pmf_power_slider_update_event(struct amd_pmf_dev *dev); > > +const char *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); > @@ -622,4 +623,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 */ > diff --git a/drivers/platform/x86/amd/pmf/spc.c b/drivers/platform/x86/amd/pmf/spc.c > index 08159cd5f853..5c6745f56ed1 100644 > --- a/drivers/platform/x86/amd/pmf/spc.c > +++ b/drivers/platform/x86/amd/pmf/spc.c > @@ -13,6 +13,43 @@ > #include <linux/power_supply.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", source_as_str(in->ev_info.power_source)); > + dev_dbg(dev->dev, "Battery Percentage : %d\n", in->ev_info.bat_percentage); > + dev_dbg(dev->dev, "Designed Battery Capacity : %d\n", in->ev_info.bat_design); > + dev_dbg(dev->dev, "Fully Charged Capacity : %d\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 : %d\n", in->ev_info.socket_power); > + dev_dbg(dev->dev, "Skin Temperature : %d\n", in->ev_info.skin_temperature); > + dev_dbg(dev->dev, "Avg C0 Residency : %d\n", in->ev_info.avg_c0residency); > + dev_dbg(dev->dev, "Max C0 Residency : %d\n", in->ev_info.max_c0residency); > + dev_dbg(dev->dev, "GFX Busy : %d\n", in->ev_info.gfx_busy); > + dev_dbg(dev->dev, "Connected Display Count : %d\n", in->ev_info.monitor_count); > + dev_dbg(dev->dev, "LID State : %s\n", in->ev_info.lid_state ? "Close" : "Open"); > + dev_dbg(dev->dev, "==== TA inputs END ====\n"); Again, the printf format specifiers are wrong, shouldn't the compiler warn about them? > +} > +#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; > diff --git a/drivers/platform/x86/amd/pmf/sps.c b/drivers/platform/x86/amd/pmf/sps.c > index a70e67749be3..13e36b52dfe8 100644 > --- a/drivers/platform/x86/amd/pmf/sps.c > +++ b/drivers/platform/x86/amd/pmf/sps.c > @@ -27,7 +27,7 @@ static const char *slider_as_str(unsigned int state) > } > } > > -static const char *source_as_str(unsigned int state) > +const char *source_as_str(unsigned int state) > { > switch (state) { > case POWER_SOURCE_AC: > diff --git a/drivers/platform/x86/amd/pmf/tee-if.c b/drivers/platform/x86/amd/pmf/tee-if.c > index 1629856c20b4..4844782d93c7 100644 > --- a/drivers/platform/x86/amd/pmf/tee-if.c > +++ b/drivers/platform/x86/amd/pmf/tee-if.c > @@ -186,6 +186,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:%d result:%x\n", out->actions_count, > ta_sm->pmf_result); > amd_pmf_apply_policies(dev, out); > -- i.