diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/i86pc/cpu/generic_cpu/gcpu_mca.c | 3 | ||||
-rw-r--r-- | usr/src/uts/i86pc/os/cmi_hw.c | 1 | ||||
-rw-r--r-- | usr/src/uts/i86pc/os/cpuid.c | 76 | ||||
-rw-r--r-- | usr/src/uts/i86pc/os/cpuid_subr.c | 50 | ||||
-rw-r--r-- | usr/src/uts/i86pc/os/cpupm/cpupm_amd.c | 5 | ||||
-rw-r--r-- | usr/src/uts/i86pc/os/hma.c | 2 | ||||
-rw-r--r-- | usr/src/uts/i86pc/os/startup.c | 1 | ||||
-rw-r--r-- | usr/src/uts/intel/ia32/os/cpc_subr.c | 3 | ||||
-rw-r--r-- | usr/src/uts/intel/io/amdzen/amdzen.c | 12 | ||||
-rw-r--r-- | usr/src/uts/intel/io/amdzen/amdzen.h | 5 | ||||
-rw-r--r-- | usr/src/uts/intel/pcbe/opteron_pcbe.c | 10 | ||||
-rw-r--r-- | usr/src/uts/intel/sys/x86_archext.h | 18 |
12 files changed, 152 insertions, 34 deletions
diff --git a/usr/src/uts/i86pc/cpu/generic_cpu/gcpu_mca.c b/usr/src/uts/i86pc/cpu/generic_cpu/gcpu_mca.c index a7ea684f9c..2f71105178 100644 --- a/usr/src/uts/i86pc/cpu/generic_cpu/gcpu_mca.c +++ b/usr/src/uts/i86pc/cpu/generic_cpu/gcpu_mca.c @@ -1366,7 +1366,8 @@ gcpu_mca_init(cmi_hdl_t hdl) */ if (!gcpu_suppress_log_on_init && ((vendor == X86_VENDOR_Intel && family >= 0xf) || - vendor == X86_VENDOR_AMD)) + vendor == X86_VENDOR_AMD || + vendor == X86_VENDOR_HYGON)) gcpu_mca_logout(hdl, NULL, -1ULL, NULL, B_FALSE, GCPU_MPT_WHAT_POKE_ERR); diff --git a/usr/src/uts/i86pc/os/cmi_hw.c b/usr/src/uts/i86pc/os/cmi_hw.c index aa549569b0..fb59826431 100644 --- a/usr/src/uts/i86pc/os/cmi_hw.c +++ b/usr/src/uts/i86pc/os/cmi_hw.c @@ -1272,6 +1272,7 @@ cmi_hdl_create(enum cmi_hdl_class class, uint_t chipid, uint_t coreid, switch (vendor) { case X86_VENDOR_Intel: case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: if (cmi_ext_topo_check == 0) { cpuid_get_ext_topo((cpu_t *)priv, &cmi_core_nbits, &cmi_strand_nbits); diff --git a/usr/src/uts/i86pc/os/cpuid.c b/usr/src/uts/i86pc/os/cpuid.c index 3681c1a059..97e5c10aec 100644 --- a/usr/src/uts/i86pc/os/cpuid.c +++ b/usr/src/uts/i86pc/os/cpuid.c @@ -1817,6 +1817,7 @@ platform_cpuid_mangle(uint_t vendor, uint32_t eax, struct cpuid_regs *cp) } break; case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: switch (eax) { case 0x80000001: @@ -2077,7 +2078,8 @@ cpuid_gather_apicid(struct cpuid_info *cpi) } } - if (cpi->cpi_vendor == X86_VENDOR_AMD && + if ((cpi->cpi_vendor == X86_VENDOR_AMD || + cpi->cpi_vendor == X86_VENDOR_HYGON) && is_x86_feature(x86_featureset, X86FSET_TOPOEXT) && cpi->cpi_xmaxeax >= CPUID_LEAF_EXT_1e) { return (cpi->cpi_extd[0x1e].cp_eax); @@ -2742,7 +2744,8 @@ cpuid_use_amd_retpoline(struct cpuid_info *cpi) uint64_t val; on_trap_data_t otd; - if (cpi->cpi_vendor != X86_VENDOR_AMD) + if (cpi->cpi_vendor != X86_VENDOR_AMD && + cpi->cpi_vendor != X86_VENDOR_HYGON) return (B_FALSE); /* @@ -2881,7 +2884,8 @@ cpuid_scan_security(cpu_t *cpu, uchar_t *featureset) struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi; x86_spectrev2_mitigation_t v2mit; - if (cpi->cpi_vendor == X86_VENDOR_AMD && + if ((cpi->cpi_vendor == X86_VENDOR_AMD || + cpi->cpi_vendor == X86_VENDOR_HYGON) && cpi->cpi_xmaxeax >= CPUID_LEAF_EXT_8) { if (cpi->cpi_extd[8].cp_ebx & CPUID_AMD_EBX_IBPB) add_x86_feature(featureset, X86FSET_IBPB); @@ -3092,7 +3096,8 @@ cpuid_pass1_topology(cpu_t *cpu, uchar_t *featureset) cpi = cpu->cpu_m.mcpu_cpi; - if (cpi->cpi_vendor == X86_VENDOR_AMD) { + if (cpi->cpi_vendor == X86_VENDOR_AMD || + cpi->cpi_vendor == X86_VENDOR_HYGON) { cpuid_gather_amd_topology_leaves(cpu); } @@ -3108,6 +3113,7 @@ cpuid_pass1_topology(cpu_t *cpu, uchar_t *featureset) &cpi->cpi_ncore_per_chip); break; case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: cpuid_amd_ncores(cpi, &cpi->cpi_ncpu_per_chip, &cpi->cpi_ncore_per_chip); break; @@ -3157,7 +3163,8 @@ cpuid_pass1_topology(cpu_t *cpu, uchar_t *featureset) cpi->cpi_clogid = 0; cpi->cpi_coreid = cpu->cpu_id; cpi->cpi_pkgcoreid = 0; - if (cpi->cpi_vendor == X86_VENDOR_AMD) { + if (cpi->cpi_vendor == X86_VENDOR_AMD || + cpi->cpi_vendor == X86_VENDOR_HYGON) { cpi->cpi_procnodeid = BITX(cpi->cpi_apicid, 3, 0); } else { cpi->cpi_procnodeid = cpi->cpi_chipid; @@ -3168,6 +3175,7 @@ cpuid_pass1_topology(cpu_t *cpu, uchar_t *featureset) cpuid_intel_getids(cpu, featureset); break; case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: cpuid_amd_getids(cpu, featureset); break; default: @@ -3358,6 +3366,9 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset) if (CPI_FAMILY(cpi) == 0xf) cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4; break; + case X86_VENDOR_HYGON: + cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4; + break; default: if (cpi->cpi_model == 0xf) cpi->cpi_model += CPI_MODEL_XTD(cpi) << 4; @@ -3471,6 +3482,10 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset) #endif break; + case X86_VENDOR_HYGON: + /* Enable all for Hygon Dhyana CPU */ + mask_ecx = 0xffffffff; + break; case X86_VENDOR_TM: /* * workaround the NT workaround in CMS 4.1 @@ -3934,6 +3949,7 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset) x86_type == X86_TYPE_CYRIX_GXm) xcpuid++; break; + case X86_VENDOR_HYGON: case X86_VENDOR_Centaur: case X86_VENDOR_TM: default: @@ -3955,6 +3971,7 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset) switch (cpi->cpi_vendor) { case X86_VENDOR_Intel: case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: if (cpi->cpi_xmaxeax < 0x80000001) break; cp = &cpi->cpi_extd[1]; @@ -3998,7 +4015,8 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset) add_x86_feature(featureset, X86FSET_1GPG); } - if ((cpi->cpi_vendor == X86_VENDOR_AMD) && + if ((cpi->cpi_vendor == X86_VENDOR_AMD || + cpi->cpi_vendor == X86_VENDOR_HYGON) && (cpi->cpi_std[1].cp_edx & CPUID_INTC_EDX_FXSR) && (cp->cp_ecx & CPUID_AMD_ECX_SSE4A)) { add_x86_feature(featureset, X86FSET_SSE4A); @@ -4019,7 +4037,8 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset) * that AMD processors don't support sysenter * in long mode at all, so don't try to program them. */ - if (x86_vendor == X86_VENDOR_AMD) { + if (x86_vendor == X86_VENDOR_AMD || + x86_vendor == X86_VENDOR_HYGON) { remove_x86_feature(featureset, X86FSET_SEP); } @@ -4073,6 +4092,7 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset) } /*FALLTHROUGH*/ case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: if (cpi->cpi_xmaxeax < CPUID_LEAF_EXT_8) break; cp = &cpi->cpi_extd[8]; @@ -4084,7 +4104,8 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset) /* * AMD uses ebx for some extended functions. */ - if (cpi->cpi_vendor == X86_VENDOR_AMD) { + if (cpi->cpi_vendor == X86_VENDOR_AMD || + cpi->cpi_vendor == X86_VENDOR_HYGON) { /* * While we're here, check for the AMD "Error * Pointer Zero/Restore" feature. This can be @@ -4120,6 +4141,7 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset) switch (cpi->cpi_vendor) { case X86_VENDOR_Intel: case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: if (cpi->cpi_maxeax >= 7) { cp = &cpi->cpi_extd[7]; cp->cp_eax = 0x80000007; @@ -4152,7 +4174,8 @@ cpuid_pass1(cpu_t *cpu, uchar_t *featureset) cpi->cpi_socket = _cpuid_skt(cpi->cpi_vendor, cpi->cpi_family, cpi->cpi_model, cpi->cpi_step); - if (cpi->cpi_vendor == X86_VENDOR_AMD) { + if (cpi->cpi_vendor == X86_VENDOR_AMD || + cpi->cpi_vendor == X86_VENDOR_HYGON) { if (cpi->cpi_xmaxeax >= CPUID_LEAF_EXT_8 && cpi->cpi_extd[8].cp_ebx & CPUID_AMD_EBX_ERR_PTR_ZERO) { /* Special handling for AMD FP not necessary. */ @@ -5032,7 +5055,8 @@ cpuid_pass3(cpu_t *cpu) cpi->cpi_last_lvl_cacheid = cpu->cpu_id; if ((cpi->cpi_maxeax >= 4 && cpi->cpi_vendor == X86_VENDOR_Intel) || - (cpi->cpi_vendor == X86_VENDOR_AMD && + ((cpi->cpi_vendor == X86_VENDOR_AMD || + cpi->cpi_vendor == X86_VENDOR_HYGON) && cpi->cpi_xmaxeax >= CPUID_LEAF_EXT_1d && is_x86_feature(x86_featureset, X86FSET_TOPOEXT))) { uint32_t leaf; @@ -5394,6 +5418,7 @@ cpuid_pass4(cpu_t *cpu, uint_t *hwcap_out) /*FALLTHROUGH*/ case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: edx = &cpi->cpi_support[AMD_EDX_FEATURES]; ecx = &cpi->cpi_support[AMD_ECX_FEATURES]; @@ -5410,6 +5435,7 @@ cpuid_pass4(cpu_t *cpu, uint_t *hwcap_out) break; case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: if (!is_x86_feature(x86_featureset, X86FSET_TSCP)) *edx &= ~CPUID_AMD_EDX_TSCP; if (!is_x86_feature(x86_featureset, X86FSET_SSE4A)) @@ -5452,6 +5478,7 @@ cpuid_pass4(cpu_t *cpu, uint_t *hwcap_out) switch (cpi->cpi_vendor) { case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: if (*edx & CPUID_AMD_EDX_TSCP) hwcap_flags |= AV_386_TSCP; if (*ecx & CPUID_AMD_ECX_AHF64) @@ -5596,7 +5623,8 @@ cpuid_syscall32_insn(cpu_t *cpu) { struct cpuid_info *cpi = cpu->cpu_m.mcpu_cpi; - if (cpi->cpi_vendor == X86_VENDOR_AMD && + if ((cpi->cpi_vendor == X86_VENDOR_AMD || + cpi->cpi_vendor == X86_VENDOR_HYGON) && cpi->cpi_xmaxeax >= 0x80000001 && (CPI_FEATURES_XTD_EDX(cpi) & CPUID_AMD_EDX_SYSC)) return (1); @@ -5814,7 +5842,9 @@ cpuid_have_cr8access(cpu_t *cpu) ASSERT(cpu != NULL); cpi = cpu->cpu_m.mcpu_cpi; - if (cpi->cpi_vendor == X86_VENDOR_AMD && cpi->cpi_maxeax >= 1 && + if ((cpi->cpi_vendor == X86_VENDOR_AMD || + cpi->cpi_vendor == X86_VENDOR_HYGON) && + cpi->cpi_maxeax >= 1 && (CPI_FEATURES_XTD_ECX(cpi) & CPUID_AMD_ECX_CR8D) != 0) return (1); return (0); @@ -6782,6 +6812,8 @@ x86_which_cacheinfo(struct cpuid_info *cpi) (cpi->cpi_family == 5 && cpi->cpi_model >= 1)) return (X86_VENDOR_AMD); break; + case X86_VENDOR_HYGON: + return (X86_VENDOR_AMD); case X86_VENDOR_TM: if (cpi->cpi_family >= 5) return (X86_VENDOR_AMD); @@ -6878,6 +6910,9 @@ cpuid_set_cpu_properties(void *dip, processorid_t cpu_id, case X86_VENDOR_AMD: create = cpi->cpi_family >= 0xf; break; + case X86_VENDOR_HYGON: + create = 1; + break; default: create = 0; break; @@ -6894,6 +6929,9 @@ cpuid_set_cpu_properties(void *dip, processorid_t cpu_id, case X86_VENDOR_AMD: create = CPI_FAMILY(cpi) == 0xf; break; + case X86_VENDOR_HYGON: + create = 1; + break; default: create = 0; break; @@ -6905,6 +6943,7 @@ cpuid_set_cpu_properties(void *dip, processorid_t cpu_id, /* generation */ switch (cpi->cpi_vendor) { case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: /* * AMD K5 model 1 was the first part to support this */ @@ -6931,6 +6970,9 @@ cpuid_set_cpu_properties(void *dip, processorid_t cpu_id, case X86_VENDOR_AMD: create = cpi->cpi_family >= 0xf; break; + case X86_VENDOR_HYGON: + create = 1; + break; default: create = 0; break; @@ -6951,6 +6993,9 @@ cpuid_set_cpu_properties(void *dip, processorid_t cpu_id, case X86_VENDOR_AMD: create = cpi->cpi_family >= 0xf; break; + case X86_VENDOR_HYGON: + create = 1; + break; default: create = 0; break; @@ -6981,6 +7026,9 @@ cpuid_set_cpu_properties(void *dip, processorid_t cpu_id, case X86_VENDOR_AMD: create = cpi->cpi_family >= 0xf; break; + case X86_VENDOR_HYGON: + create = 1; + break; default: create = 0; break; @@ -6993,6 +7041,7 @@ cpuid_set_cpu_properties(void *dip, processorid_t cpu_id, switch (cpi->cpi_vendor) { case X86_VENDOR_Intel: case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: case X86_VENDOR_Cyrix: case X86_VENDOR_TM: case X86_VENDOR_Centaur: @@ -7506,7 +7555,8 @@ cpuid_pass_ucode(cpu_t *cpu, uchar_t *fset) cp.cp_ecx = 0; (void) __cpuid_insn(&cp); cpi->cpi_std[7] = cp; - } else if (cpi->cpi_vendor == X86_VENDOR_AMD) { + } else if (cpi->cpi_vendor == X86_VENDOR_AMD || + cpi->cpi_vendor == X86_VENDOR_HYGON) { /* No xcpuid support */ if (cpi->cpi_family < 5 || (cpi->cpi_family == 5 && cpi->cpi_model < 1)) diff --git a/usr/src/uts/i86pc/os/cpuid_subr.c b/usr/src/uts/i86pc/os/cpuid_subr.c index faa3e75b03..934b5d547d 100644 --- a/usr/src/uts/i86pc/os/cpuid_subr.c +++ b/usr/src/uts/i86pc/os/cpuid_subr.c @@ -88,12 +88,13 @@ * 15 for family 0x17, models 30 - 3f * 16 for family 0x17, models 60 - 6f * 17 for family 0x17, models 70 - 7f - * 18 for family 0x19, models 00 - 0f - * 19 for family 0x19, models 20 - 2f + * 18 for family 0x18, models 00 - 0f + * 19 for family 0x19, models 00 - 0f + * 20 for family 0x19, models 20 - 2f * Second index by (model & 0x3) for family 0fh, * CPUID pkg bits (Fn8000_0001_EBX[31:28]) for later families. */ -static uint32_t amd_skts[20][8] = { +static uint32_t amd_skts[21][8] = { /* * Family 0xf revisions B through E */ @@ -365,7 +366,7 @@ static uint32_t amd_skts[20][8] = { }, /* - * Family 0x19 models 00-0f (Zen 3 - Milan) + * Family 0x18 models 00-0f (Dhyana) */ #define A_SKTS_18 18 { @@ -373,6 +374,21 @@ static uint32_t amd_skts[20][8] = { X86_SOCKET_UNKNOWN, /* 0b001 */ X86_SOCKET_UNKNOWN, /* 0b010 */ X86_SOCKET_UNKNOWN, /* 0b011 */ + X86_SOCKET_SL1, /* 0b100 */ + X86_SOCKET_UNKNOWN, /* 0b101 */ + X86_SOCKET_DM1, /* 0b110 */ + X86_SOCKET_SL1R2 /* 0b111 */ + }, + + /* + * Family 0x19 models 00-0f (Zen 3 - Milan) + */ +#define A_SKTS_19 19 + { + X86_SOCKET_UNKNOWN, /* 0b000 */ + X86_SOCKET_UNKNOWN, /* 0b001 */ + X86_SOCKET_UNKNOWN, /* 0b010 */ + X86_SOCKET_UNKNOWN, /* 0b011 */ X86_SOCKET_SP3, /* 0b100 */ X86_SOCKET_UNKNOWN, /* 0b101 */ X86_SOCKET_UNKNOWN, /* 0b110 */ @@ -382,7 +398,7 @@ static uint32_t amd_skts[20][8] = { /* * Family 0x19 models 20-2f (Zen 3 - Vermeer) */ -#define A_SKTS_19 19 +#define A_SKTS_20 20 { X86_SOCKET_UNKNOWN, /* 0b000 */ X86_SOCKET_UNKNOWN, /* 0b001 */ @@ -399,7 +415,7 @@ struct amd_sktmap_s { uint32_t skt_code; char sktstr[16]; }; -static struct amd_sktmap_s amd_sktmap_strs[X86_NUM_SOCKETS_AMD + 1] = { +static struct amd_sktmap_s amd_sktmap_strs[X86_NUM_SOCKETS + 1] = { { X86_SOCKET_754, "754" }, { X86_SOCKET_939, "939" }, { X86_SOCKET_940, "940" }, @@ -434,6 +450,9 @@ static struct amd_sktmap_s amd_sktmap_strs[X86_NUM_SOCKETS_AMD + 1] = { { X86_SOCKET_FP5, "FP5" }, { X86_SOCKET_FP6, "FP6" }, { X86_SOCKET_STRX4, "sTRX4" }, + { X86_SOCKET_SL1, "SL1" }, + { X86_SOCKET_SL1R2, "SL1R2" }, + { X86_SOCKET_DM1, "DM1" }, { X86_SOCKET_UNKNOWN, "Unknown" } }; @@ -459,8 +478,9 @@ static const struct amd_skt_mapent { { 0x17, 0x30, 0x3f, A_SKTS_15 }, { 0x17, 0x60, 0x6f, A_SKTS_16 }, { 0x17, 0x70, 0x7f, A_SKTS_17 }, - { 0x19, 0x00, 0x0f, A_SKTS_18 }, - { 0x19, 0x20, 0x2f, A_SKTS_19 } + { 0x18, 0x00, 0x0f, A_SKTS_18 }, + { 0x19, 0x00, 0x0f, A_SKTS_19 }, + { 0x19, 0x20, 0x2f, A_SKTS_20 } }; /* @@ -629,7 +649,13 @@ static const struct amd_rev_mapent { A_SKTS_15 }, { 0x17, 0x71, 0x71, 0x0, 0x0, X86_CHIPREV_AMD_17_MTS_B0, "MTS-B0", - A_SKTS_17 } + A_SKTS_17 }, + + /* + * =============== HygonGenuine Family 0x18 =============== + */ + { 0x18, 0x00, 0x00, 0x1, 0x1, X86_CHIPREV_HYGON_18_DN_A1, "DN_A1", + A_SKTS_18 }, }; /* @@ -759,6 +785,7 @@ _cpuid_skt(uint_t vendor, uint_t family, uint_t model, uint_t step) switch (vendor) { case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: synth_amd_info(family, model, step, &skt, NULL, NULL); break; @@ -779,6 +806,7 @@ _cpuid_sktstr(uint_t vendor, uint_t family, uint_t model, uint_t step) switch (vendor) { case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: synth_amd_info(family, model, step, &skt, NULL, NULL); sktmapp = amd_sktmap_strs; @@ -805,6 +833,7 @@ _cpuid_chiprev(uint_t vendor, uint_t family, uint_t model, uint_t step) switch (vendor) { case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: synth_amd_info(family, model, step, NULL, &chiprev, NULL); break; @@ -823,6 +852,7 @@ _cpuid_chiprevstr(uint_t vendor, uint_t family, uint_t model, uint_t step) switch (vendor) { case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: synth_amd_info(family, model, step, NULL, NULL, &revstr); break; @@ -851,6 +881,8 @@ _cpuid_vendorstr_to_vendorcode(char *vendorstr) return (X86_VENDOR_Intel); else if (strcmp(vendorstr, X86_VENDORSTR_AMD) == 0) return (X86_VENDOR_AMD); + else if (strcmp(vendorstr, X86_VENDORSTR_HYGON) == 0) + return (X86_VENDOR_HYGON); else if (strcmp(vendorstr, X86_VENDORSTR_TM) == 0) return (X86_VENDOR_TM); else if (strcmp(vendorstr, CyrixInstead) == 0) diff --git a/usr/src/uts/i86pc/os/cpupm/cpupm_amd.c b/usr/src/uts/i86pc/os/cpupm/cpupm_amd.c index 086d9a8fe6..c99c191c40 100644 --- a/usr/src/uts/i86pc/os/cpupm/cpupm_amd.c +++ b/usr/src/uts/i86pc/os/cpupm/cpupm_amd.c @@ -37,8 +37,9 @@ cpupm_amd_init(cpu_t *cp) cpupm_mach_state_t *mach_state = (cpupm_mach_state_t *)(cp->cpu_m.mcpu_pm_mach_state); - /* AMD? */ - if (x86_vendor != X86_VENDOR_AMD) + /* AMD or Hygon? */ + if (x86_vendor != X86_VENDOR_AMD && + x86_vendor != X86_VENDOR_HYGON) return (B_FALSE); /* diff --git a/usr/src/uts/i86pc/os/hma.c b/usr/src/uts/i86pc/os/hma.c index 0e84030ac1..a53c797e4b 100644 --- a/usr/src/uts/i86pc/os/hma.c +++ b/usr/src/uts/i86pc/os/hma.c @@ -101,6 +101,7 @@ hma_init(void) (void) hma_vmx_init(); break; case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: (void) hma_svm_init(); break; default: @@ -121,6 +122,7 @@ hma_register_backend(const char *name) is_ready = hma_vmx_ready; break; case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: is_ready = hma_svm_ready; break; default: diff --git a/usr/src/uts/i86pc/os/startup.c b/usr/src/uts/i86pc/os/startup.c index 106666f5b2..f36e8b0e79 100644 --- a/usr/src/uts/i86pc/os/startup.c +++ b/usr/src/uts/i86pc/os/startup.c @@ -3211,6 +3211,7 @@ setx86isalist(void) switch (x86_vendor) { case X86_VENDOR_Intel: case X86_VENDOR_AMD: + case X86_VENDOR_HYGON: case X86_VENDOR_TM: if (is_x86_feature(x86_featureset, X86FSET_CMOV)) { /* diff --git a/usr/src/uts/intel/ia32/os/cpc_subr.c b/usr/src/uts/intel/ia32/os/cpc_subr.c index f7b86fd602..a74dfd77bc 100644 --- a/usr/src/uts/intel/ia32/os/cpc_subr.c +++ b/usr/src/uts/intel/ia32/os/cpc_subr.c @@ -140,7 +140,8 @@ kcpc_hw_init(cpu_t *cp) strands_perfmon_shared = 1; } } - } else if (cpuid_getvendor(cpu[0]) == X86_VENDOR_AMD) { + } else if (cpuid_getvendor(cpu[0]) == X86_VENDOR_AMD || + cpuid_getvendor(cpu[0]) == X86_VENDOR_HYGON) { /* * On AMD systems with HT, all of the performance * monitors exist on a per-logical CPU basis. diff --git a/usr/src/uts/intel/io/amdzen/amdzen.c b/usr/src/uts/intel/io/amdzen/amdzen.c index ac6ce9c94f..bd023a2edf 100644 --- a/usr/src/uts/intel/io/amdzen/amdzen.c +++ b/usr/src/uts/intel/io/amdzen/amdzen.c @@ -624,7 +624,7 @@ amdzen_stub_scan_cb(dev_info_t *dip, void *arg) return (DDI_WALK_CONTINUE); } - if (vid != AMDZEN_PCI_VID_AMD) { + if (vid != AMDZEN_PCI_VID_AMD && vid != AMDZEN_PCI_VID_HYGON) { return (DDI_WALK_CONTINUE); } @@ -737,9 +737,10 @@ amdzen_attach_stub(dev_info_t *dip, ddi_attach_cmd_t cmd) return (DDI_FAILURE); } - if (vid != AMDZEN_PCI_VID_AMD) { - dev_err(dip, CE_WARN, "expected AMD vendor ID (0x%x), found " - "0x%x", AMDZEN_PCI_VID_AMD, vid); + if (vid != AMDZEN_PCI_VID_AMD && vid != AMDZEN_PCI_VID_HYGON) { + dev_err(dip, CE_WARN, "expected vendor ID (0x%x), found 0x%x", + cpuid_getvendor(CPU) == X86_VENDOR_HYGON ? + AMDZEN_PCI_VID_HYGON : AMDZEN_PCI_VID_AMD, vid); return (DDI_FAILURE); } @@ -996,7 +997,8 @@ _init(void) { int ret; - if (cpuid_getvendor(CPU) != X86_VENDOR_AMD) { + if (cpuid_getvendor(CPU) != X86_VENDOR_AMD && + cpuid_getvendor(CPU) != X86_VENDOR_HYGON) { return (ENOTSUP); } diff --git a/usr/src/uts/intel/io/amdzen/amdzen.h b/usr/src/uts/intel/io/amdzen/amdzen.h index 8150495911..6ba5266bd3 100644 --- a/usr/src/uts/intel/io/amdzen/amdzen.h +++ b/usr/src/uts/intel/io/amdzen/amdzen.h @@ -200,6 +200,11 @@ typedef enum { */ #define AMDZEN_PCI_VID_AMD 0x1022 +/* + * Hygon PCI ID for reference + */ +#define AMDZEN_PCI_VID_HYGON 0x1d94 + typedef enum { AMDZEN_STUB_TYPE_DF, AMDZEN_STUB_TYPE_NB diff --git a/usr/src/uts/intel/pcbe/opteron_pcbe.c b/usr/src/uts/intel/pcbe/opteron_pcbe.c index c4496bf8ca..8d567daa64 100644 --- a/usr/src/uts/intel/pcbe/opteron_pcbe.c +++ b/usr/src/uts/intel/pcbe/opteron_pcbe.c @@ -547,7 +547,8 @@ opt_pcbe_init(void) * loads this module based on its name in the module directory, but it * could have been renamed. */ - if (cpuid_getvendor(CPU) != X86_VENDOR_AMD || amd_family < 0xf) + if ((cpuid_getvendor(CPU) != X86_VENDOR_AMD || amd_family < 0xf) && + cpuid_getvendor(CPU) != X86_VENDOR_HYGON) return (-1); if (amd_family == 0xf) { @@ -556,7 +557,9 @@ opt_pcbe_init(void) "AMD Opteron & Athlon64"); } else { (void) snprintf(amd_pcbe_impl_name, sizeof (amd_pcbe_impl_name), - "AMD Family %02xh", amd_family); + "%s Family %02xh", + cpuid_getvendor(CPU) == X86_VENDOR_HYGON ? "Hygon" : "AMD", + amd_family); } /* @@ -598,7 +601,8 @@ opt_pcbe_init(void) amd_pcbe_cpuref = amd_fam_11h_bkdg; amd_events = family_11h_events; amd_generic_events = opt_generic_events; - } else if (amd_family == 0x17 && amd_model <= 0x2f) { + } else if ((amd_family == 0x17 && amd_model <= 0x2f) || + amd_family == 0x18) { amd_pcbe_cpuref = amd_fam_17h_zen1_reg; amd_events = opteron_pcbe_f17h_zen1_events; amd_generic_events = family_17h_zen1_papi_events; diff --git a/usr/src/uts/intel/sys/x86_archext.h b/usr/src/uts/intel/sys/x86_archext.h index b75ab18f5e..2ec543677b 100644 --- a/usr/src/uts/intel/sys/x86_archext.h +++ b/usr/src/uts/intel/sys/x86_archext.h @@ -804,6 +804,9 @@ extern "C" { #define X86_VENDOR_NSC 10 #define X86_VENDORSTR_NSC "Geode by NSC" +#define X86_VENDOR_HYGON 11 +#define X86_VENDORSTR_HYGON "HygonGenuine" + /* * Vendor string max len + \0 */ @@ -968,6 +971,12 @@ extern "C" { _X86_CHIPREV_MKREV(X86_VENDOR_AMD, 0x17, 0x0009) /* + * Definitions for Hygon Family 0x18 + */ +#define X86_CHIPREV_HYGON_18_DN_A1 \ + _X86_CHIPREV_MKREV(X86_VENDOR_HYGON, 0x18, 0x0001) + +/* * Various socket/package types, extended as the need to distinguish * a new type arises. The top 8 byte identfies the vendor and the * remaining 24 bits describe 24 socket types. @@ -1026,6 +1035,15 @@ extern "C" { #define X86_SOCKET_STRX4 _X86_SOCKET_MKVAL(X86_VENDOR_AMD, 0x23) #define X86_NUM_SOCKETS_AMD 0x24 +/* + * Hygon socket types + */ +#define X86_SOCKET_SL1 _X86_SOCKET_MKVAL(X86_VENDOR_HYGON, 0x01) +#define X86_SOCKET_SL1R2 _X86_SOCKET_MKVAL(X86_VENDOR_HYGON, 0x02) +#define X86_SOCKET_DM1 _X86_SOCKET_MKVAL(X86_VENDOR_HYGON, 0x03) +#define X86_NUM_SOCKETS_HYGON 0x04 + +#define X86_NUM_SOCKETS (X86_NUM_SOCKETS_AMD + X86_NUM_SOCKETS_HYGON) /* * Definitions for Intel processor models. These are all for Family 6 |