summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/i86pc/os/cpuid_subr.c175
-rw-r--r--usr/src/uts/intel/sys/x86_archext.h6
2 files changed, 134 insertions, 47 deletions
diff --git a/usr/src/uts/i86pc/os/cpuid_subr.c b/usr/src/uts/i86pc/os/cpuid_subr.c
index 6343051ef2..83b3e115eb 100644
--- a/usr/src/uts/i86pc/os/cpuid_subr.c
+++ b/usr/src/uts/i86pc/os/cpuid_subr.c
@@ -34,6 +34,7 @@
* Copyright 2012 Jens Elkner <jel+illumos@cs.uni-magdeburg.de>
* Copyright 2012 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
* Copyright 2019 Joyent, Inc.
+ * Copyright 2020 Oxide Computer Company
*/
/*
@@ -61,6 +62,7 @@
#include <sys/bitmap.h>
#include <sys/x86_archext.h>
#include <sys/pci_cfgspace.h>
+#include <sys/sysmacros.h>
#ifdef __xpv
#include <sys/hypervisor.h>
#endif
@@ -82,13 +84,14 @@
* 11 for family 0x16, models 00 - 0f
* 12 for family 0x16, models 30 - 3f
* 13 for family 0x17, models 00 - 0f
- * 14 for family 0x17, models 10 - 1f
+ * 14 for family 0x17, models 10 - 2f
* 15 for family 0x17, models 30 - 3f
- * 16 for family 0x17, models 70 - 7f
+ * 16 for family 0x17, models 60 - 6f
+ * 17 for family 0x17, models 70 - 7f
* Second index by (model & 0x3) for family 0fh,
* CPUID pkg bits (Fn8000_0001_EBX[31:28]) for later families.
*/
-static uint32_t amd_skts[17][8] = {
+static uint32_t amd_skts[18][8] = {
/*
* Family 0xf revisions B through E
*/
@@ -298,7 +301,9 @@ static uint32_t amd_skts[17][8] = {
},
/*
- * Family 0x17 models 10-1f (Zen 1 - APU: Raven Ridge)
+ * Family 0x17 models 10-2f (Zen 1 - APU: Raven Ridge)
+ * (Zen 1 - APU: Banded Kestrel)
+ * (Zen 1 - APU: Dali)
*/
#define A_SKTS_14 14
{
@@ -328,10 +333,25 @@ static uint32_t amd_skts[17][8] = {
},
/*
- * Family 0x17 models 70-7f (Zen 2 - Matisse)
+ * Family 0x17 models 60-6f (Zen 2 - Renoir)
*/
#define A_SKTS_16 16
{
+ X86_SOCKET_FP6, /* 0b000 */
+ X86_SOCKET_UNKNOWN, /* 0b001 */
+ X86_SOCKET_AM4, /* 0b010 */
+ X86_SOCKET_UNKNOWN, /* 0b011 */
+ X86_SOCKET_UNKNOWN, /* 0b100 */
+ X86_SOCKET_UNKNOWN, /* 0b101 */
+ X86_SOCKET_UNKNOWN, /* 0b110 */
+ X86_SOCKET_UNKNOWN /* 0b111 */
+ },
+
+ /*
+ * Family 0x17 models 70-7f (Zen 2 - Matisse)
+ */
+#define A_SKTS_17 17
+ {
X86_SOCKET_UNKNOWN, /* 0b000 */
X86_SOCKET_UNKNOWN, /* 0b001 */
X86_SOCKET_AM4, /* 0b010 */
@@ -347,7 +367,7 @@ struct amd_sktmap_s {
uint32_t skt_code;
char sktstr[16];
};
-static struct amd_sktmap_s amd_sktmap[X86_NUM_SOCKETS_AMD + 1] = {
+static struct amd_sktmap_s amd_sktmap_strs[X86_NUM_SOCKETS_AMD + 1] = {
{ X86_SOCKET_754, "754" },
{ X86_SOCKET_939, "939" },
{ X86_SOCKET_940, "940" },
@@ -380,9 +400,34 @@ static struct amd_sktmap_s amd_sktmap[X86_NUM_SOCKETS_AMD + 1] = {
{ X86_SOCKET_SP3, "SP3" },
{ X86_SOCKET_SP3R2, "SP3r2" },
{ X86_SOCKET_FP5, "FP5" },
+ { X86_SOCKET_FP6, "FP6" },
{ X86_SOCKET_UNKNOWN, "Unknown" }
};
+static const struct amd_skt_mapent {
+ uint_t sm_family;
+ uint_t sm_modello;
+ uint_t sm_modelhi;
+ uint_t sm_sktidx;
+} amd_sktmap[] = {
+ { 0x10, 0x00, 0xff, A_SKTS_2 },
+ { 0x11, 0x00, 0xff, A_SKTS_3 },
+ { 0x12, 0x00, 0xff, A_SKTS_4 },
+ { 0x14, 0x00, 0x0f, A_SKTS_5 },
+ { 0x15, 0x00, 0x0f, A_SKTS_6 },
+ { 0x15, 0x10, 0x1f, A_SKTS_7 },
+ { 0x15, 0x30, 0x3f, A_SKTS_8 },
+ { 0x15, 0x60, 0x6f, A_SKTS_9 },
+ { 0x15, 0x70, 0x7f, A_SKTS_10 },
+ { 0x16, 0x00, 0x0f, A_SKTS_11 },
+ { 0x16, 0x30, 0x3f, A_SKTS_12 },
+ { 0x17, 0x00, 0x0f, A_SKTS_13 },
+ { 0x17, 0x10, 0x2f, A_SKTS_14 },
+ { 0x17, 0x30, 0x3f, A_SKTS_15 },
+ { 0x17, 0x60, 0x6f, A_SKTS_16 },
+ { 0x17, 0x70, 0x7f, A_SKTS_17 }
+};
+
/*
* Table for mapping AMD Family 0xf and AMD Family 0x10 model/stepping
* combination to chip "revision" and socket type.
@@ -398,7 +443,7 @@ static const struct amd_rev_mapent {
uint_t rm_stephi;
uint32_t rm_chiprev;
const char *rm_chiprevstr;
- int rm_sktidx;
+ uint_t rm_sktidx;
} amd_revmap[] = {
/*
* =============== AuthenticAMD Family 0xf ===============
@@ -547,8 +592,79 @@ static const struct amd_rev_mapent {
A_SKTS_15 },
{ 0x17, 0x31, 0x31, 0x0, 0x0, X86_CHIPREV_AMD_17_SSP_B0, "SSP-B0",
A_SKTS_15 },
+
+ { 0x17, 0x71, 0x71, 0x0, 0x0, X86_CHIPREV_AMD_17_MTS_B0, "MTS-B0",
+ A_SKTS_17 }
};
+/*
+ * AMD keeps the socket type in CPUID Fn8000_0001_EBX, bits 31:28.
+ */
+static uint32_t
+synth_amd_skt_cpuid(uint_t family, uint_t sktid)
+{
+ struct cpuid_regs cp;
+ uint_t idx;
+
+ cp.cp_eax = 0x80000001;
+ (void) __cpuid_insn(&cp);
+
+ /* PkgType bits */
+ idx = BITX(cp.cp_ebx, 31, 28);
+
+ if (idx > 7) {
+ return (X86_SOCKET_UNKNOWN);
+ }
+
+ if (family == 0x10) {
+ uint32_t val;
+
+ val = pci_getl_func(0, 24, 2, 0x94);
+ if (BITX(val, 8, 8)) {
+ if (amd_skts[sktid][idx] == X86_SOCKET_AM2R2) {
+ return (X86_SOCKET_AM3);
+ } else if (amd_skts[sktid][idx] == X86_SOCKET_S1g3) {
+ return (X86_SOCKET_S1g4);
+ }
+ }
+ }
+
+ return (amd_skts[sktid][idx]);
+}
+
+static void
+synth_amd_skt(uint_t family, uint_t model, uint32_t *skt_p)
+{
+ int platform;
+ const struct amd_skt_mapent *skt;
+ uint_t i;
+
+ if (skt_p == NULL || family < 0xf)
+ return;
+
+#ifdef __xpv
+ /* PV guest */
+ if (!is_controldom()) {
+ *skt_p = X86_SOCKET_UNKNOWN;
+ return;
+ }
+#endif
+ platform = get_hwenv();
+
+ if ((platform & HW_VIRTUAL) != 0) {
+ *skt_p = X86_SOCKET_UNKNOWN;
+ return;
+ }
+
+ for (i = 0, skt = amd_sktmap; i < ARRAY_SIZE(amd_sktmap);
+ i++, skt++) {
+ if (family == skt->sm_family &&
+ model >= skt->sm_modello && model <= skt->sm_modelhi) {
+ *skt_p = synth_amd_skt_cpuid(family, skt->sm_sktidx);
+ }
+ }
+}
+
static void
synth_amd_info(uint_t family, uint_t model, uint_t step,
uint32_t *skt_p, uint32_t *chiprev_p, const char **chiprevstr_p)
@@ -560,8 +676,7 @@ synth_amd_info(uint_t family, uint_t model, uint_t step,
if (family < 0xf)
return;
- for (i = 0, rmp = amd_revmap; i < sizeof (amd_revmap) / sizeof (*rmp);
- i++, rmp++) {
+ for (i = 0, rmp = amd_revmap; i < ARRAY_SIZE(amd_revmap); i++, rmp++) {
if (family == rmp->rm_family &&
model >= rmp->rm_modello && model <= rmp->rm_modelhi &&
step >= rmp->rm_steplo && step <= rmp->rm_stephi) {
@@ -570,8 +685,10 @@ synth_amd_info(uint_t family, uint_t model, uint_t step,
}
}
- if (!found)
+ if (!found) {
+ synth_amd_skt(family, model, skt_p);
return;
+ }
if (chiprev_p != NULL)
*chiprev_p = rmp->rm_chiprev;
@@ -595,41 +712,7 @@ synth_amd_info(uint_t family, uint_t model, uint_t step,
} else if (family == 0xf) {
*skt_p = amd_skts[rmp->rm_sktidx][model & 0x3];
} else {
- /*
- * Starting with family 10h, socket type is stored in
- * CPUID Fn8000_0001_EBX
- */
- struct cpuid_regs cp;
- int idx;
-
- cp.cp_eax = 0x80000001;
- (void) __cpuid_insn(&cp);
-
- /* PkgType bits */
- idx = BITX(cp.cp_ebx, 31, 28);
-
- if (idx > 7) {
- /* Reserved bits */
- *skt_p = X86_SOCKET_UNKNOWN;
- } else {
- *skt_p = amd_skts[rmp->rm_sktidx][idx];
- }
- if (family == 0x10) {
- /*
- * Look at Ddr3Mode bit of DRAM Configuration
- * High Register to decide whether this is
- * actually AM3 or S1g4.
- */
- uint32_t val;
-
- val = pci_getl_func(0, 24, 2, 0x94);
- if (BITX(val, 8, 8)) {
- if (*skt_p == X86_SOCKET_AM2R2)
- *skt_p = X86_SOCKET_AM3;
- else if (*skt_p == X86_SOCKET_S1g3)
- *skt_p = X86_SOCKET_S1g4;
- }
- }
+ *skt_p = synth_amd_skt_cpuid(family, rmp->rm_sktidx);
}
}
}
@@ -663,7 +746,7 @@ _cpuid_sktstr(uint_t vendor, uint_t family, uint_t model, uint_t step)
case X86_VENDOR_AMD:
synth_amd_info(family, model, step, &skt, NULL, NULL);
- sktmapp = amd_sktmap;
+ sktmapp = amd_sktmap_strs;
while (sktmapp->skt_code != X86_SOCKET_UNKNOWN) {
if (sktmapp->skt_code == skt)
break;
diff --git a/usr/src/uts/intel/sys/x86_archext.h b/usr/src/uts/intel/sys/x86_archext.h
index f5e4a4b153..eed3c5fd4e 100644
--- a/usr/src/uts/intel/sys/x86_archext.h
+++ b/usr/src/uts/intel/sys/x86_archext.h
@@ -962,6 +962,9 @@ extern "C" {
#define X86_CHIPREV_AMD_17_SSP_B0 \
_X86_CHIPREV_MKREV(X86_VENDOR_AMD, 0x17, 0x0008)
+#define X86_CHIPREV_AMD_17_MTS_B0 \
+ _X86_CHIPREV_MKREV(X86_VENDOR_AMD, 0x17, 0x0009)
+
/*
* Various socket/package types, extended as the need to distinguish
* a new type arises. The top 8 byte identfies the vendor and the
@@ -1017,7 +1020,8 @@ extern "C" {
#define X86_SOCKET_SP3 _X86_SOCKET_MKVAL(X86_VENDOR_AMD, 0x1f)
#define X86_SOCKET_SP3R2 _X86_SOCKET_MKVAL(X86_VENDOR_AMD, 0x20)
#define X86_SOCKET_FP5 _X86_SOCKET_MKVAL(X86_VENDOR_AMD, 0x21)
-#define X86_NUM_SOCKETS_AMD 0x22
+#define X86_SOCKET_FP6 _X86_SOCKET_MKVAL(X86_VENDOR_AMD, 0x22)
+#define X86_NUM_SOCKETS_AMD 0x23
/*