lkml.org 
[lkml]   [2017]   [Oct]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.13 34/43] x86/cpu/AMD: Apply the Erratum 688 fix when the BIOS doesnt
    Date
    4.13-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Borislav Petkov <bp@suse.de>

    commit bfc1168de949cd3e9ca18c3480b5085deff1ea7c upstream.

    Some F14h machines have an erratum which, "under a highly specific
    and detailed set of internal timing conditions" can lead to skipping
    instructions and RIP corruption.

    Add the fix for those machines when their BIOS doesn't apply it or
    there simply isn't BIOS update for them.

    Tested-by: <mirh@protonmail.ch>
    Signed-off-by: Borislav Petkov <bp@suse.de>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Sherry Hurwitz <sherry.hurwitz@amd.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Yazen Ghannam <Yazen.Ghannam@amd.com>
    Link: http://lkml.kernel.org/r/20171022104731.28249-1-bp@alien8.de
    Link: https://bugzilla.kernel.org/show_bug.cgi?id=197285
    [ Added pr_info() that we activated the workaround. ]
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/x86/kernel/amd_nb.c | 41 +++++++++++++++++++++++++++++++++++++++++
    1 file changed, 41 insertions(+)

    --- a/arch/x86/kernel/amd_nb.c
    +++ b/arch/x86/kernel/amd_nb.c
    @@ -27,6 +27,8 @@ static const struct pci_device_id amd_ro
    {}
    };

    +#define PCI_DEVICE_ID_AMD_CNB17H_F4 0x1704
    +
    const struct pci_device_id amd_nb_misc_ids[] = {
    { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB_MISC) },
    { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) },
    @@ -37,6 +39,7 @@ const struct pci_device_id amd_nb_misc_i
    { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F3) },
    { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_M30H_NB_F3) },
    { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_DF_F3) },
    + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CNB17H_F3) },
    {}
    };
    EXPORT_SYMBOL_GPL(amd_nb_misc_ids);
    @@ -48,6 +51,7 @@ static const struct pci_device_id amd_nb
    { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_NB_F4) },
    { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_16H_M30H_NB_F4) },
    { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_DF_F4) },
    + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CNB17H_F4) },
    {}
    };

    @@ -402,11 +406,48 @@ void amd_flush_garts(void)
    }
    EXPORT_SYMBOL_GPL(amd_flush_garts);

    +static void __fix_erratum_688(void *info)
    +{
    +#define MSR_AMD64_IC_CFG 0xC0011021
    +
    + msr_set_bit(MSR_AMD64_IC_CFG, 3);
    + msr_set_bit(MSR_AMD64_IC_CFG, 14);
    +}
    +
    +/* Apply erratum 688 fix so machines without a BIOS fix work. */
    +static __init void fix_erratum_688(void)
    +{
    + struct pci_dev *F4;
    + u32 val;
    +
    + if (boot_cpu_data.x86 != 0x14)
    + return;
    +
    + if (!amd_northbridges.num)
    + return;
    +
    + F4 = node_to_amd_nb(0)->link;
    + if (!F4)
    + return;
    +
    + if (pci_read_config_dword(F4, 0x164, &val))
    + return;
    +
    + if (val & BIT(2))
    + return;
    +
    + on_each_cpu(__fix_erratum_688, NULL, 0);
    +
    + pr_info("x86/cpu/AMD: CPU erratum 688 worked around\n");
    +}
    +
    static __init int init_amd_nbs(void)
    {
    amd_cache_northbridges();
    amd_cache_gart();

    + fix_erratum_688();
    +
    return 0;
    }


    \
     
     \ /
      Last update: 2017-10-31 11:03    [W:4.048 / U:0.444 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site