@@ -350,7 +350,8 @@ static void __init early_cpu_detect(void)
hap_paddr_bits = PADDR_BITS;
}
- if (c->x86_vendor != X86_VENDOR_AMD)
+ if (c->x86_vendor != X86_VENDOR_AMD &&
+ c->x86_vendor != X86_VENDOR_HYGON)
park_offline_cpus = opt_mce;
initialize_cpu_data(0);
@@ -203,10 +203,11 @@ static void mce_amd_work_fn(void *data)
void __init amd_nonfatal_mcheck_init(struct cpuinfo_x86 *c)
{
- if (c->x86_vendor != X86_VENDOR_AMD)
+ if (c->x86_vendor != X86_VENDOR_AMD &&
+ c->x86_vendor != X86_VENDOR_HYGON)
return;
- /* Assume we are on K8 or newer AMD CPU here */
+ /* Assume we are on K8 or newer AMD or Hygon CPU here */
/* The threshold bitfields in MSR_IA32_MC4_MISC has
* been introduced along with the SVME feature bit. */
@@ -778,6 +778,7 @@ void mcheck_init(struct cpuinfo_x86 *c, bool bsp)
switch ( c->x86_vendor )
{
case X86_VENDOR_AMD:
+ case X86_VENDOR_HYGON:
inited = amd_mcheck_init(c);
break;
@@ -1172,10 +1173,11 @@ static bool x86_mc_msrinject_verify(struct xen_mc_msrinject *mci)
/* MSRs that the HV will take care of */
case MSR_K8_HWCR:
- if ( c->x86_vendor == X86_VENDOR_AMD )
+ if ( c->x86_vendor == X86_VENDOR_AMD ||
+ c->x86_vendor == X86_VENDOR_HYGON )
reason = "HV will operate HWCR";
else
- reason = "only supported on AMD";
+ reason = "only supported on AMD or Hygon";
break;
default:
@@ -286,7 +286,10 @@ enum mcheck_type
amd_mcheck_init(struct cpuinfo_x86 *ci)
{
uint32_t i;
- enum mcequirk_amd_flags quirkflag = mcequirk_lookup_amd_quirkdata(ci);
+ enum mcequirk_amd_flags quirkflag = 0;
+
+ if (ci->x86_vendor != X86_VENDOR_HYGON)
+ quirkflag = mcequirk_lookup_amd_quirkdata(ci);
/* Assume that machine check support is available.
* The minimum provided support is at least the K8. */
@@ -101,7 +101,8 @@ static int __init init_nonfatal_mce_checker(void)
*/
switch (c->x86_vendor) {
case X86_VENDOR_AMD:
- /* Assume we are on K8 or newer AMD CPU here */
+ case X86_VENDOR_HYGON:
+ /* Assume we are on K8 or newer AMD or Hygon CPU here */
amd_nonfatal_mcheck_init(c);
break;
@@ -154,6 +154,7 @@ static int bank_mce_rdmsr(const struct vcpu *v, uint32_t msr, uint64_t *val)
break;
case X86_VENDOR_AMD:
+ case X86_VENDOR_HYGON:
ret = vmce_amd_rdmsr(v, msr, val);
break;
@@ -284,6 +285,7 @@ static int bank_mce_wrmsr(struct vcpu *v, uint32_t msr, uint64_t val)
break;
case X86_VENDOR_AMD:
+ case X86_VENDOR_HYGON:
ret = vmce_amd_wrmsr(v, msr, val);
break;