x86: Use P-states and C-states (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 30 Jun 2016 19:20:22 +0000 (15:20 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 30 Jun 2016 21:04:18 +0000 (17:04 -0400)
commitace0473ebdef5db62ce974e684859a9bee28b4af
tree82a9990f87c700b19f3ffe4f7c09483ece63d76c
parent2d92e1664cc3972a78fdcc26a1dab26c4812df4f
x86: Use P-states and C-states (XCC)

To use turbo mode, we need to both set the fastest P-state, which is the
turbo mode ratio, and have the halted cores enter a deep enough C-state to
allow the hardware to boost the 'active' cores.  To halt in any C-state
deeper than C1, you need to use mwait.

For those curious, you can see the max ratio available, given the number of
active cores, in MSR_TURBO_RATIO_LIMIT.  For instance, on my Haswell, I get
something like:

/ $ rdmsr 0x1ad
Core   0, MSR 0x000001ad: 0x1a1a1b1c1d1e2020

That means that if you have 0-1 cores active, they can each get to 0x20.
Two cores, 0x1e.  Etc.  If all cores are active, it's 0x1a.  (There are
other MSRs for the additional cores, but they are all 0x1a).

Those ratios are multiplied by the bus freq, 100 MHz in this case.  So this
means the top-end for Turbo mode is 3.2 GHz.  If all the cores are running,
each core maxes out at 2.6 GHz.  The default at boot is 0x18, which is
2.4 GHz, and also happens to be the (invariant) TSC frequency.

This commit adds a very basic infrastructure for managing P-states and
C-states, and it uses mwait to halt when available.

By default, every core will be set to the fastest P-state and the
shallowest sleep that still allows Turbo mode.  I think.

I'll provide an interface via devarch for users to tweak this however
they'd like.  As future work, we can add something like Linux's idle driver
and/or acpi-cpufreq driver.  Or we can just leave it to userspace.

Reinstall your kernel headers.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/Kbuild
kern/arch/x86/arch.h
kern/arch/x86/cpuinfo.c
kern/arch/x86/idle.c [new file with mode: 0644]
kern/arch/x86/ros/cpu_feat.h
kern/arch/x86/ros/msr-index.h
kern/arch/x86/smp_boot.c
kern/arch/x86/x86.h