From: Borislav Petkov <bp@amd64.org>
To: Thomas Renninger <trenn@suse.de>
Cc: "cpufreq@vger.kernel.org" <cpufreq@vger.kernel.org>,
"linux@dominikbrodowski.net" <linux@dominikbrodowski.net>,
Len Brown <len.brown@intel.com>
Subject: Re: [PATCH 5/5] cpupowerutils: Introduce -b/-t --boost/--turbo cpufreq-info param
Date: Tue, 5 Oct 2010 16:47:17 +0200 [thread overview]
Message-ID: <20101005144717.GA20505@aftab> (raw)
In-Reply-To: <1286281394-14699-6-git-send-email-trenn@suse.de>
From: Thomas Renninger <trenn@suse.de>
Date: Tue, Oct 05, 2010 at 08:23:14AM -0400
> Prints out this by default (also works with --cpu X param):
> Analyzing Boost Capabilities on CPU 0:
> Supported: yes
> Active: yes
I think it would be simpler if you dump the boosting information in
cpufreq-info, i.e. without an explicit --boost option or whatever. You
can then use the "--boost" option to control the boosting like this:
cpufreq-set --boost (on|off) - toggles boosting
cpufreq-set --boost - without an option could dump the current boosting setting.
Hmm...
> With activation one has to be careful...
> On AMD, it's enough if any of the CPUs shows "Active: no" and boost mode
> is not active (cmp with powernow-k8 kernel code).
yes. But we keep it consistent so that all cores show either off or on.
<snip>
> Possible further enhancements:
> cpufreq-set --turbo_active (or similar)
see above.
> to enable/disable turbo/boost mode.
>
> For AMD there already is:
> /sys/devices/system/cpu/cpu0/cpufreq/cpb
> but this could all get handled in userspace and this recently introduced
> interface could get removed again.
I don't think it will be removed soon. Rather, if you use the /sysfs
interface you need kernel support for it and cpufrequtils might run on
older kernels which don't have the feature yet. So you want to do all
the detection/control in userspace, independent from the kernel version.
> Then enabling/disabling could all be done on CPU 0 which cannot be taken
> offline.
> -> To be discussed.
You need to enable/disable the boosting on AMD by toggling bit 25 in
MSR_K7_HWCR on all cpus.
> Potentially dangerous is if cores get offlined while boost mode got
> disbled, then the userspace tool would not be able to enable it again.
> But as this stuff is meant for debugging and performance measuring
> only, it should be enough to document this a bit in a manpage...
You can issue a warning whenever you detect that a subset of the cores
has been offlined. Then the tool should fail changing the boosting
state, IMHO.
> Signed-off-by: Thomas Renninger <trenn@suse.de>
> CC: Dominik Brodowski <linux@dominikbrodowski.net>
> CC: cpufreq@vger.kernel.org
> CC: Borislav Petkov <borislav.petkov@amd.com>
> CC: Len Brown <len.brown@intel.com>
> ---
> lib/cpufreq.c | 37 +++++++++++++++++++++++++++++++++++++
> lib/cpufreq.h | 8 ++++++++
> lib/msr.c | 37 +++++++++++++++++++++++++++++++++++++
> lib/msr.h | 5 +++++
> utils/cpufreq-info.c | 29 ++++++++++++++++++++++++++++-
> 5 files changed, 115 insertions(+), 1 deletions(-)
>
> diff --git a/lib/cpufreq.c b/lib/cpufreq.c
> index ae7d8c5..0b5fe9f 100644
> --- a/lib/cpufreq.c
> +++ b/lib/cpufreq.c
> @@ -12,6 +12,8 @@
>
> #include "cpufreq.h"
> #include "sysfs.h"
> +#include "cpuid.h"
> +#include "msr.h"
>
> int cpufreq_cpu_exists(unsigned int cpu)
> {
> @@ -188,3 +190,38 @@ unsigned long cpufreq_get_transitions(unsigned int cpu) {
>
> return (ret);
> }
> +
> +int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active)
> +{
> + struct cpupower_cpu_info cpu_info;
> + int ret;
> +
> + *support = *active = 0;
> +
> + ret = get_cpu_info(0, &cpu_info);
> + if (ret)
> + return ret;
> +
> + if (cpu_info.vendor == X86_VENDOR_INTEL) {
> + ret = msr_intel_has_boost_support(cpu);
> + if (ret <= 0)
> + return ret;
> + *support = ret;
> + ret = msr_intel_boost_is_active(cpu);
> + if (ret <= 0)
> + return ret;
> + *active = ret;
> + } else if (cpu_info.vendor == X86_VENDOR_AMD) {
> + if (cpu_info.ext_cpuid_level < 0x80000007)
> + return 0;
> + if ((cpuid_edx(0x80000007) >> 9) & 0x1)
> + *support = 1;
> + else
> + return 0;
wrap this in amd_has_boost_support()?
> + ret = msr_amd_boost_is_active(cpu);
> + if (ret <= 0)
> + return ret;
> + *active = ret;
> + }
> + return 0;
> +}
> diff --git a/lib/cpufreq.h b/lib/cpufreq.h
> index 03be906..506b6fc 100644
> --- a/lib/cpufreq.h
> +++ b/lib/cpufreq.h
> @@ -208,6 +208,14 @@ extern int cpufreq_modify_policy_governor(unsigned int cpu, char *governor);
>
> extern int cpufreq_set_frequency(unsigned int cpu, unsigned long target_frequency);
>
> +/* get boost mode support/activation
> + *
> + * Check whether Intel's "Turbo Boost Technology" or AMD's
> + * "Dynamic Speed Boost Technology" is supported and if, whether it's activated
> + */
> +extern int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active);
> +
> +
> #ifdef __cplusplus
> }
> #endif
> diff --git a/lib/msr.c b/lib/msr.c
> index bccea8d..9921ff1 100644
> --- a/lib/msr.c
> +++ b/lib/msr.c
> @@ -18,6 +18,8 @@
> #include <sys/stat.h>
> #include <sys/types.h>
>
> +#define MSR_IA32_MISC_ENABLES 0x1a0
> +
>
> /* General X86 MSRs */
> #define MSR_IA32_APERF 0x000000E8
> @@ -25,9 +27,11 @@
>
> /* AMD specific MSRs */
> #define MSR_FIDVID_STATUS 0xc0010042
> +#define MSR_K7_HWCR 0xc0010015
>
> /* Intel specific MSRs */
> #define MSR_IA32_PERF_STATUS 0x198
> +#define MSR_IA32_MISC_ENABLES 0x1a0
>
> /* AMD specific bits */
> #define AMD_S_HI_CURRENT_VID 0x0000001f
> @@ -123,8 +127,41 @@ int msr_amd_get_fidvid(unsigned int cpu, uint32_t *fid, uint32_t *vid)
> return 0;
> }
>
> +int msr_amd_boost_is_active(unsigned int cpu)
> +{
> + uint64_t k7_hwcr;
> + int ret;
> +
> + ret = read_msr(cpu, MSR_K7_HWCR, &k7_hwcr);
> + if (ret)
> + return ret;
> + return !((k7_hwcr >> 25) & 0x1);
> +}
This should be done differently on AMD: we want to
iterate over all cores and check this bit and see
whether its setting is consistent. See how it is done in
<arch/x86/kernel/cpu/cpufreq/powernow-k8.c::powernowk8_init()> in the
kernel.
--
Regards/Gruss,
Boris.
Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach
General Managers: Alberto Bozzo, Andrew Bowd
Registration: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632
next prev parent reply other threads:[~2010-10-05 14:47 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-05 12:23 cpupowerutils: easier use of msr and cpuid stuff and some more Thomas Renninger
2010-10-05 12:23 ` [PATCH 1/5] cpupowerutils: Move read_msr from cpufreq-aperf.c into own /lib/msr.c file Thomas Renninger
2010-10-05 12:23 ` [PATCH 2/5] cpupowerutils: Let older tools make use of global read_msr functions Thomas Renninger
2010-10-05 12:23 ` [PATCH 3/5] cpupowerutils: Move utils/cpuid.h to lib/cpuid.h Thomas Renninger
2010-10-05 12:38 ` Thomas Renninger
2010-10-05 12:23 ` [PATCH 4/5] cpupowerutils: Add get_cpu_info(..) func to cpuid.h Thomas Renninger
2010-10-05 14:09 ` [PATCH] cpupowerutils: Add get_cpu_info(..) func to cpuid.h V2 Thomas Renninger
2010-10-05 12:23 ` [PATCH 5/5] cpupowerutils: Introduce -b/-t --boost/--turbo cpufreq-info param Thomas Renninger
2010-10-05 13:25 ` Mattia Dongili
2010-10-05 13:43 ` Thomas Renninger
2010-10-05 14:47 ` Borislav Petkov [this message]
2010-10-05 14:52 ` Dominik Brodowski
2010-10-05 15:10 ` Borislav Petkov
2010-10-05 15:18 ` Thomas Renninger
2010-10-05 15:56 ` Borislav Petkov
2010-10-13 21:17 ` Thomas Renninger
2010-10-14 4:44 ` Borislav Petkov
2010-10-05 14:15 ` cpupowerutils: easier use of msr and cpuid stuff and some more Dominik Brodowski
2010-10-05 14:37 ` Thomas Renninger
2010-10-05 14:43 ` Dominik Brodowski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101005144717.GA20505@aftab \
--to=bp@amd64.org \
--cc=cpufreq@vger.kernel.org \
--cc=len.brown@intel.com \
--cc=linux@dominikbrodowski.net \
--cc=trenn@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox