• Thomas Gleixner's avatar
    x86/amd: Check for the C1E bug post ACPI subsystem init · e7ff3a47
    Thomas Gleixner authored
    AMD CPUs affected by the E400 erratum suffer from the issue that the
    local APIC timer stops when the CPU goes into C1E. Unfortunately there
    is no way to detect the affected CPUs on early boot. It's only possible
    to determine the range of possibly affected CPUs from the family/model
    range.
    
    The actual decision whether to enter C1E and thus cause the bug is done
    by the firmware and we need to detect that case late, after ACPI has
    been initialized.
    
    The current solution is to check in the idle routine whether the CPU is
    affected by reading the MSR_K8_INT_PENDING_MSG MSR and checking for the
    K8_INTP_C1E_ACTIVE_MASK bits. If one of the bits is set then the CPU is
    affected and the system is switched into forced broadcast mode.
    
    This is ineffective and on non-affected CPUs every entry to idle does
    the extra RDMSR.
    
    After doing some research it turns out that the bits are visible on the
    boot CPU right after the ACPI subsystem is initialized in the early
    boot process. So instead of polling for the bits in the idle loop, add
    a detection function after acpi_subsystem_init() and check for the MSR
    bits. If set, then the X86_BUG_AMD_APIC_C1E is set on the boot CPU and
    the TSC is marked unstable when X86_FEATURE_NONSTOP_TSC is not set as it
    will stop in C1E state as well.
    
    The switch to broadcast mode cannot be done at this point because the
    boot CPU still uses HPET as a clockevent device and the local APIC timer
    is not yet calibrated and installed. The switch to broadcast mode on the
    affected CPUs needs to be done when the local APIC timer is actually set
    up.
    
    This allows to cleanup the amd_e400_idle() function in the next step.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Link: http://lkml.kernel.org/r/20161209182912.2726-4-bp@alien8.deSigned-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    e7ff3a47
main.c 25.1 KB