[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] x86, amd: Disable GartTlbWlkErr when BIOS forgets it



On 12/12/2011 15:25, "Jan Beulich" <JBeulich@xxxxxxxx> wrote:

> This patch disables GartTlbWlk errors on AMD Fam10h CPUs if the BIOS
> forgets to do is (or is just too old). Letting these errors enabled
> can cause a sync-flood on the CPU causing a reboot.
> 
> The AMD BKDG recommends disabling GART TLB Wlk Error completely.
> 
> Based on a Linux patch from Joerg Roedel <joerg.roedel@xxxxxxx>; see e.g.
> https://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=patch;h=5bbc09
> 7d890409d8eff4e3f1d26f11a9d6b7c07e
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>

Acked-by: Keir Fraser <keir@xxxxxxx>

> --- 2011-11-23.orig/xen/arch/x86/cpu/mcheck/amd_f10.c 2011-12-05
> 11:38:34.000000000 +0100
> +++ 2011-11-23/xen/arch/x86/cpu/mcheck/amd_f10.c 2011-12-05 11:17:03.000000000
> +0100
> @@ -46,6 +46,7 @@
>  #include <asm/msr.h>
>  
>  #include "mce.h"
> +#include "mce_quirks.h"
>  #include "x86_mca.h"
>  
>  
> @@ -91,9 +92,14 @@ amd_f10_handler(struct mc_info *mi, uint
>  /* AMD Family10 machine check */
>  enum mcheck_type amd_f10_mcheck_init(struct cpuinfo_x86 *c)
>  { 
> + enum mcequirk_amd_flags quirkflag = mcequirk_lookup_amd_quirkdata(c);
> +
> if (amd_k8_mcheck_init(c) == mcheck_none)
> return mcheck_none;
>  
> + if (quirkflag == MCEQUIRK_F10_GART)
> +  mcequirk_amd_apply(quirkflag);
> +
> x86_mce_callback_register(amd_f10_handler);
>  
> return mcheck_amd_famXX;
> --- 2011-11-23.orig/xen/arch/x86/cpu/mcheck/mce_amd_quirks.c 2011-12-05
> 11:38:34.000000000 +0100
> +++ 2011-11-23/xen/arch/x86/cpu/mcheck/mce_amd_quirks.c 2011-12-05
> 11:41:00.000000000 +0100
> @@ -29,6 +29,8 @@ static const struct mce_quirkdata mce_am
>  MCEQUIRK_K7_BANK0 },
> { 0xf /* cpu family */, ANY /* all models */, ANY /* all steppings */,
>  MCEQUIRK_K8_GART },
> + { 0x10 /* cpu family */, ANY /* all models */, ANY /* all steppings */,
> +   MCEQUIRK_F10_GART },
>  };
>  
>  enum mcequirk_amd_flags
> @@ -54,6 +56,8 @@ mcequirk_lookup_amd_quirkdata(struct cpu
>  
>  int mcequirk_amd_apply(enum mcequirk_amd_flags flags)
>  {
> + u64 val;
> +
> switch (flags) {
> case MCEQUIRK_K7_BANK0:
> return 1; /* first bank */
> @@ -67,6 +71,10 @@ int mcequirk_amd_apply(enum mcequirk_amd
> wrmsrl(MSR_IA32_MC4_CTL, ~(1ULL << 10));
> wrmsrl(MSR_IA32_MC4_STATUS, 0ULL);
> break;
> + case MCEQUIRK_F10_GART:
> +  if (rdmsr_safe(MSR_AMD64_MCx_MASK(4), val) == 0)
> +   wrmsr_safe(MSR_AMD64_MCx_MASK(4), val | (1 << 10));
> +  break;
> }
>  
> return 0;
> --- 2011-11-23.orig/xen/arch/x86/cpu/mcheck/mce_quirks.h 2011-12-05
> 11:38:34.000000000 +0100
> +++ 2011-11-23/xen/arch/x86/cpu/mcheck/mce_quirks.h 2011-12-05
> 11:11:45.000000000 +0100
> @@ -33,8 +33,9 @@ struct mce_quirkdata {
>   */
>  
>  enum mcequirk_amd_flags {
> - MCEQUIRK_K7_BANK0 = 0x1,
> - MCEQUIRK_K8_GART = 0x2,
> + MCEQUIRK_K7_BANK0 = 1,
> + MCEQUIRK_K8_GART,
> + MCEQUIRK_F10_GART
>  };
>  
>  enum mcequirk_intel_flags {
> --- 2011-11-23.orig/xen/include/asm-x86/msr-index.h 2011-12-05
> 11:38:34.000000000 +0100
> +++ 2011-11-23/xen/include/asm-x86/msr-index.h 2011-12-05 11:06:39.000000000
> +0100
> @@ -98,6 +98,8 @@
>  #define CMCI_EN    (1UL<<30)
>  #define CMCI_THRESHOLD_MASK  0x7FFF
>  
> +#define MSR_AMD64_MC0_MASK  0xc0010044
> +
>  #define MSR_IA32_MC1_CTL  0x00000404
>  #define MSR_IA32_MC1_CTL2  0x00000281
>  #define MSR_IA32_MC1_STATUS  0x00000405
> @@ -151,6 +153,8 @@
>  #define MSR_IA32_MCx_ADDR(x)  (MSR_IA32_MC0_ADDR + 4*(x))
>  #define MSR_IA32_MCx_MISC(x)  (MSR_IA32_MC0_MISC + 4*(x))
>  
> +#define MSR_AMD64_MCx_MASK(x)  (MSR_AMD64_MC0_MASK + (x))
> +
>  #define MSR_P6_PERFCTR0   0x000000c1
>  #define MSR_P6_PERFCTR1   0x000000c2
>  #define MSR_P6_EVNTSEL0   0x00000186
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.