@@ -708,6 +708,46 @@ void start_gather_func(int argc, char *argv[])
pause();
}
+static unsigned int calculate_activity_window(const xc_cppc_para_t *cppc,
+ const char **units)
+{
+ unsigned int mantissa = MASK_EXTR(cppc->activity_window,
+ XEN_CPPC_ACT_WINDOW_MANTISSA_MASK);
+ unsigned int exponent = MASK_EXTR(cppc->activity_window,
+ XEN_CPPC_ACT_WINDOW_EXPONENT_MASK);
+ unsigned int multiplier = 1;
+ unsigned int i;
+
+ /*
+ * SDM only states a 0 register is hardware selected, and doesn't mention
+ * a 0 mantissa with a non-0 exponent. Only special case a 0 register.
+ */
+ if ( cppc->activity_window == 0 )
+ {
+ *units = "hardware selected";
+
+ return 0;
+ }
+
+ if ( exponent >= 6 )
+ {
+ *units = "s";
+ exponent -= 6;
+ }
+ else if ( exponent >= 3 )
+ {
+ *units = "ms";
+ exponent -= 3;
+ }
+ else
+ *units = "us";
+
+ for ( i = 0; i < exponent; i++ )
+ multiplier *= 10;
+
+ return mantissa * multiplier;
+}
+
/* print out parameters about cpu frequency */
static void print_cpufreq_para(int cpuid, struct xc_get_cpufreq_para *p_cpufreq)
{
@@ -772,6 +812,32 @@ static void print_cpufreq_para(int cpuid, struct xc_get_cpufreq_para *p_cpufreq)
p_cpufreq->u.s.scaling_min_freq,
p_cpufreq->u.s.scaling_cur_freq);
}
+ else
+ {
+ const xc_cppc_para_t *cppc = &p_cpufreq->u.cppc_para;
+
+ printf("cppc variables :\n");
+ printf(" hardware limits : lowest [%u] lowest nonlinear [%u]\n",
+ cppc->lowest, cppc->lowest_nonlinear);
+ printf(" : nominal [%u] highest [%u]\n",
+ cppc->nominal, cppc->highest);
+ printf(" configured limits : min [%u] max [%u] energy perf [%u]\n",
+ cppc->minimum, cppc->maximum, cppc->energy_perf);
+
+ if ( cppc->features & XEN_SYSCTL_CPPC_FEAT_ACT_WINDOW )
+ {
+ unsigned int activity_window;
+ const char *units;
+
+ activity_window = calculate_activity_window(cppc, &units);
+ printf(" : activity_window [%u %s]\n",
+ activity_window, units);
+ }
+
+ printf(" : desired [%u%s]\n",
+ cppc->desired,
+ cppc->desired ? "" : " hw autonomous");
+ }
printf("turbo mode : %s\n",
p_cpufreq->turbo_enabled ? "enabled" : "disabled or n/a");
Print HWP-specific parameters. Some are always present, but others depend on hardware support. Signed-off-by: Jason Andryuk <jandryuk@gmail.com> --- v2: Style fixes Declare i outside loop Replace repearted hardware/configured limits with spaces Fixup for hw_ removal Use XEN_HWP_GOVERNOR Use HWP_ACT_WINDOW_EXPONENT_* Remove energy_perf hw autonomous - 0 doesn't mean autonomous v4: Return activity_window from calculate_hwp_activity_window Use blanks instead of _ in output Use MASK_EXTR Check XEN_HWP_DRIVER name since governor is no longer returned s/hwp/cppc --- tools/misc/xenpm.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+)