Message ID | 20210503192810.36084-9-jandryuk@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Intel Hardware P-States (HWP) support | expand |
On 03.05.2021 21:28, Jason Andryuk wrote: > --- a/tools/misc/xenpm.c > +++ b/tools/misc/xenpm.c > @@ -708,6 +708,43 @@ void start_gather_func(int argc, char *argv[]) > pause(); > } > > +static void calculate_hwp_activity_window(const xc_hwp_para_t *hwp, > + unsigned int *activity_window, > + const char **units) > +{ > + unsigned int mantissa = hwp->activity_window & 0x7f; > + unsigned int exponent = ( hwp->activity_window >> 7 ) & 0x7; Excess blanks inside the parentheses. > + unsigned int multiplier = 1; > + > + if ( hwp->activity_window == 0 ) > + { > + *units = "hardware selected"; > + *activity_window = 0; > + > + return; > + } > + > + if ( exponent >= 6 ) > + { > + *units = "s"; > + exponent -= 6; > + } > + else if ( exponent >= 3 ) > + { > + *units = "ms"; > + exponent -= 3; > + } > + else > + { > + *units = "us"; > + } > + > + for ( unsigned int i = 0; i < exponent; i++ ) This requires the compiler to default to C99 mode, which I don't think we enforce just yet. > + multiplier *= 10; > + > + *activity_window = mantissa * multiplier; > +} > + > /* print out parameters about cpu frequency */ > static void print_cpufreq_para(int cpuid, struct xc_get_cpufreq_para *p_cpufreq) > { > @@ -777,6 +814,40 @@ static void print_cpufreq_para(int cpuid, struct xc_get_cpufreq_para *p_cpufreq) > p_cpufreq->scaling_cur_freq); > } > > + if ( strcmp(p_cpufreq->scaling_governor, "hwp-internal") == 0 ) > + { > + const xc_hwp_para_t *hwp = &p_cpufreq->u.hwp_para; > + > + printf("hwp variables :\n"); > + printf(" hardware limits : lowest [%u] most_efficient [%u]\n", > + hwp->hw_lowest, hwp->hw_most_efficient); > + printf(" hardware limits : guaranteed [%u] highest [%u]\n", > + hwp->hw_guaranteed, hwp->hw_highest); > + printf(" configured limits : min [%u] max [%u] energy_perf [%u]\n", > + hwp->minimum, hwp->maximum, hwp->energy_perf); > + > + if ( hwp->hw_feature & XEN_SYSCTL_HWP_FEAT_ENERGY_PERF ) > + { > + printf(" configured limits : energy_perf [%u%s]\n", > + hwp->energy_perf, > + hwp->energy_perf ? "" : " hw autonomous"); > + } > + > + if ( hwp->hw_feature & XEN_SYSCTL_HWP_FEAT_ACT_WINDOW ) > + { > + unsigned int activity_window; > + const char *units; > + > + calculate_hwp_activity_window(hwp, &activity_window, &units); > + printf(" configured limits : activity_window [%u %s]\n", > + activity_window, units); > + } > + > + printf(" configured limits : desired [%u%s]\n", > + hwp->desired, > + hwp->desired ? "" : " hw autonomous"); > + } I suppose output readability would improve if you didn't repeat "hardware limits :" and "configured limits :" on continuation-like lines, but rather simply indented by enough spaces. Also again please again omit an unnecessary pair of braces. Jan
diff --git a/tools/misc/xenpm.c b/tools/misc/xenpm.c index 562bf939f9..9588dac991 100644 --- a/tools/misc/xenpm.c +++ b/tools/misc/xenpm.c @@ -708,6 +708,43 @@ void start_gather_func(int argc, char *argv[]) pause(); } +static void calculate_hwp_activity_window(const xc_hwp_para_t *hwp, + unsigned int *activity_window, + const char **units) +{ + unsigned int mantissa = hwp->activity_window & 0x7f; + unsigned int exponent = ( hwp->activity_window >> 7 ) & 0x7; + unsigned int multiplier = 1; + + if ( hwp->activity_window == 0 ) + { + *units = "hardware selected"; + *activity_window = 0; + + return; + } + + if ( exponent >= 6 ) + { + *units = "s"; + exponent -= 6; + } + else if ( exponent >= 3 ) + { + *units = "ms"; + exponent -= 3; + } + else + { + *units = "us"; + } + + for ( unsigned int i = 0; i < exponent; i++ ) + multiplier *= 10; + + *activity_window = mantissa * multiplier; +} + /* print out parameters about cpu frequency */ static void print_cpufreq_para(int cpuid, struct xc_get_cpufreq_para *p_cpufreq) { @@ -777,6 +814,40 @@ static void print_cpufreq_para(int cpuid, struct xc_get_cpufreq_para *p_cpufreq) p_cpufreq->scaling_cur_freq); } + if ( strcmp(p_cpufreq->scaling_governor, "hwp-internal") == 0 ) + { + const xc_hwp_para_t *hwp = &p_cpufreq->u.hwp_para; + + printf("hwp variables :\n"); + printf(" hardware limits : lowest [%u] most_efficient [%u]\n", + hwp->hw_lowest, hwp->hw_most_efficient); + printf(" hardware limits : guaranteed [%u] highest [%u]\n", + hwp->hw_guaranteed, hwp->hw_highest); + printf(" configured limits : min [%u] max [%u] energy_perf [%u]\n", + hwp->minimum, hwp->maximum, hwp->energy_perf); + + if ( hwp->hw_feature & XEN_SYSCTL_HWP_FEAT_ENERGY_PERF ) + { + printf(" configured limits : energy_perf [%u%s]\n", + hwp->energy_perf, + hwp->energy_perf ? "" : " hw autonomous"); + } + + if ( hwp->hw_feature & XEN_SYSCTL_HWP_FEAT_ACT_WINDOW ) + { + unsigned int activity_window; + const char *units; + + calculate_hwp_activity_window(hwp, &activity_window, &units); + printf(" configured limits : activity_window [%u %s]\n", + activity_window, units); + } + + printf(" configured limits : desired [%u%s]\n", + hwp->desired, + hwp->desired ? "" : " hw autonomous"); + } + printf("turbo mode : %s\n", p_cpufreq->turbo_enabled ? "enabled" : "disabled or n/a"); printf("\n");
Print HWP-specific parameters. Some are always present, but others depend on hardware support. Signed-off-by: Jason Andryuk <jandryuk@gmail.com> --- tools/misc/xenpm.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+)