#include <sys/types.h>
#include <sys/systm.h>
#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
static uint32_t amd_skts[][16] = {
#define A_SKTS_0 0
{
[0] = X86_SOCKET_754,
[1] = X86_SOCKET_940,
[2] = X86_SOCKET_754,
[3] = X86_SOCKET_939,
},
#define A_SKTS_1 1
{
[0] = X86_SOCKET_S1g1,
[1] = X86_SOCKET_F1207,
[3] = X86_SOCKET_AM2
},
#define A_SKTS_2 2
{
[0] = X86_SOCKET_F1207,
[1] = X86_SOCKET_AM2R2,
[2] = X86_SOCKET_S1g3,
[3] = X86_SOCKET_G34,
[4] = X86_SOCKET_ASB2,
[5] = X86_SOCKET_C32
},
#define A_SKTS_3 3
{
[2] = X86_SOCKET_S1g2
},
#define A_SKTS_4 4
{
[1] = X86_SOCKET_FS1,
[2] = X86_SOCKET_FM1
},
#define A_SKTS_5 5
{
[0] = X86_SOCKET_FT1
},
#define A_SKTS_6 6
{
[1] = X86_SOCKET_AM3R2,
[3] = X86_SOCKET_G34,
[5] = X86_SOCKET_C32
},
#define A_SKTS_7 7
{
[0] = X86_SOCKET_FP2,
[1] = X86_SOCKET_FS1R2,
[2] = X86_SOCKET_FM2
},
#define A_SKTS_8 8
{
[0] = X86_SOCKET_FP3,
[1] = X86_SOCKET_FM2R2
},
#define A_SKTS_9 9
{
[0] = X86_SOCKET_FP4,
[2] = X86_SOCKET_AM4,
[3] = X86_SOCKET_FM2R2
},
#define A_SKTS_10 10
{
[0] = X86_SOCKET_FP4,
[2] = X86_SOCKET_AM4,
[4] = X86_SOCKET_FT4
},
#define A_SKTS_11 11
{
[0] = X86_SOCKET_FT3,
[1] = X86_SOCKET_FS1B
},
#define A_SKTS_12 12
{
[0] = X86_SOCKET_FT3B,
[3] = X86_SOCKET_FP4
},
#define A_SKTS_NAPLES 13
{
[2] = X86_SOCKET_AM4,
[4] = X86_SOCKET_SP3,
[7] = X86_SOCKET_SP3R2
},
#define A_SKTS_RAVEN 14
{
[0] = X86_SOCKET_FP5,
[2] = X86_SOCKET_AM4
},
#define A_SKTS_ROME 15
{
[4] = X86_SOCKET_SP3,
[7] = X86_SOCKET_SP3R2
},
#define A_SKTS_RENOIR 16
{
[0] = X86_SOCKET_FP6,
[2] = X86_SOCKET_AM4
},
#define A_SKTS_MATISSE 17
{
[2] = X86_SOCKET_AM4,
},
#define A_SKTS_DHYANA 18
{
[4] = X86_SOCKET_SL1,
[6] = X86_SOCKET_DM1,
[7] = X86_SOCKET_SL1R2
},
#define A_SKTS_MILAN 19
{
[4] = X86_SOCKET_SP3,
[7] = X86_SOCKET_STRX4
},
#define A_SKTS_VERMEER 20
{
[2] = X86_SOCKET_AM4,
},
#define A_SKTS_CEZANNE 21
{
[0] = X86_SOCKET_FP6,
[2] = X86_SOCKET_AM4
},
#define A_SKTS_GENOA 22
{
[4] = X86_SOCKET_SP5,
[8] = X86_SOCKET_TR5
},
#define A_SKTS_REMBRANDT 23
{
[0] = X86_SOCKET_AM5,
[1] = X86_SOCKET_FP7,
[2] = X86_SOCKET_FP7R2
},
#define A_SKTS_RAPHAEL 24
{
[0] = X86_SOCKET_AM5,
[1] = X86_SOCKET_FL1
},
#define A_SKTS_UNKNOWN 25
{
},
#define A_SKTS_VANGOGH 26
{
[3] = X86_SOCKET_FF3
},
#define A_SKTS_MENDOCINO 27
{
[1] = X86_SOCKET_FT6
},
#define A_SKTS_PHOENIX 28
{
[0] = X86_SOCKET_AM5,
[1] = X86_SOCKET_FP8,
[4] = X86_SOCKET_FP7,
[5] = X86_SOCKET_FP7R2,
},
#define A_SKTS_BERGAMO 29
{
[4] = X86_SOCKET_SP5,
[8] = X86_SOCKET_SP6
},
#define A_SKTS_TURIN 30
{
[4] = X86_SOCKET_SP5,
},
#define A_SKTS_SHIMADA_PEAK 31
{
[7] = X86_SOCKET_TR5
},
#define A_SKTS_STRIX 32
{
[0] = X86_SOCKET_AM5,
[1] = X86_SOCKET_FP8
},
#define A_SKTS_GRANITE_RIDGE 33
{
[0] = X86_SOCKET_AM5,
[1] = X86_SOCKET_FL1
},
#define A_SKTS_STRIX_HALO 34
{
[1] = X86_SOCKET_FP11
}
};
struct amd_sktmap_s {
uint32_t skt_code;
char sktstr[16];
};
static struct amd_sktmap_s amd_sktmap_strs[] = {
{ X86_SOCKET_754, "754" },
{ X86_SOCKET_939, "939" },
{ X86_SOCKET_940, "940" },
{ X86_SOCKET_S1g1, "S1g1" },
{ X86_SOCKET_AM2, "AM2" },
{ X86_SOCKET_F1207, "F(1207)" },
{ X86_SOCKET_S1g2, "S1g2" },
{ X86_SOCKET_S1g3, "S1g3" },
{ X86_SOCKET_AM, "AM" },
{ X86_SOCKET_AM2R2, "AM2r2" },
{ X86_SOCKET_AM3, "AM3" },
{ X86_SOCKET_G34, "G34" },
{ X86_SOCKET_ASB2, "ASB2" },
{ X86_SOCKET_C32, "C32" },
{ X86_SOCKET_S1g4, "S1g4" },
{ X86_SOCKET_FT1, "FT1" },
{ X86_SOCKET_FM1, "FM1" },
{ X86_SOCKET_FS1, "FS1" },
{ X86_SOCKET_AM3R2, "AM3r2" },
{ X86_SOCKET_FP2, "FP2" },
{ X86_SOCKET_FS1R2, "FS1r2" },
{ X86_SOCKET_FM2, "FM2" },
{ X86_SOCKET_FP3, "FP3" },
{ X86_SOCKET_FM2R2, "FM2r2" },
{ X86_SOCKET_FP4, "FP4" },
{ X86_SOCKET_AM4, "AM4" },
{ X86_SOCKET_FT3, "FT3" },
{ X86_SOCKET_FT4, "FT4" },
{ X86_SOCKET_FS1B, "FS1b" },
{ X86_SOCKET_FT3B, "FT3b" },
{ X86_SOCKET_SP3, "SP3" },
{ X86_SOCKET_SP3R2, "SP3r2" },
{ 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_SP5, "SP5" },
{ X86_SOCKET_AM5, "AM5" },
{ X86_SOCKET_FP7, "FP7" },
{ X86_SOCKET_FP7R2, "FP7r2" },
{ X86_SOCKET_FF3, "FF3" },
{ X86_SOCKET_FT6, "FT6" },
{ X86_SOCKET_FP8, "FP8" },
{ X86_SOCKET_FL1, "FL1" },
{ X86_SOCKET_SP6, "SP6" },
{ X86_SOCKET_TR5, "TR5" },
{ X86_SOCKET_FP11, "FP11" },
{ X86_SOCKET_UNKNOWN, "Unknown" }
};
CTASSERT(ARRAY_SIZE(amd_sktmap_strs) == X86_NUM_SOCKETS + 1);
static const struct amd_rev_mapent {
uint_t rm_family;
uint_t rm_modello;
uint_t rm_modelhi;
uint_t rm_steplo;
uint_t rm_stephi;
x86_chiprev_t rm_chiprev;
const char *rm_chiprevstr;
x86_uarchrev_t rm_uarchrev;
uint_t rm_sktidx;
} amd_revmap[] = {
{ 0xf, 0x04, 0x04, 0x0, 0x0, X86_CHIPREV_AMD_LEGACY_F_REV_B, "B",
X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
{ 0xf, 0x05, 0x05, 0x0, 0x1, X86_CHIPREV_AMD_LEGACY_F_REV_B, "B",
X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
{ 0xf, 0x04, 0x05, 0x8, 0x8, X86_CHIPREV_AMD_LEGACY_F_REV_C0, "C0",
X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
{ 0xf, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_F_REV_CG, "CG",
X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
{ 0xf, 0x10, 0x1f, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_F_REV_D, "D",
X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
{ 0xf, 0x20, 0x3f, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_F_REV_E, "E",
X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
{ 0xf, 0x40, 0x5f, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_F_REV_F, "F",
X86_UARCHREV_AMD_LEGACY, A_SKTS_1 },
{ 0xf, 0x60, 0x6f, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_F_REV_G, "G",
X86_UARCHREV_AMD_LEGACY, A_SKTS_1 },
{ 0x10, 0x00, 0x00, 0x0, 0x2, X86_CHIPREV_AMD_LEGACY_10_REV_A, "A",
X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
{ 0x10, 0x02, 0x02, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_10_REV_B, "B",
X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
{ 0x10, 0x4, 0x6, 0x0, 0x2, X86_CHIPREV_AMD_LEGACY_10_REV_C2, "C2",
X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
{ 0x10, 0x4, 0x6, 0x3, 0xf, X86_CHIPREV_AMD_LEGACY_10_REV_C3, "C3",
X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
{ 0x10, 0x8, 0x9, 0x0, 0x0, X86_CHIPREV_AMD_LEGACY_10_REV_D0, "D0",
X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
{ 0x10, 0x8, 0x9, 0x1, 0xf, X86_CHIPREV_AMD_LEGACY_10_REV_D1, "D1",
X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
{ 0x10, 0xA, 0xA, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_10_REV_E, "E",
X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
{ 0x10, 0x0, 0xff, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_10_UNKNOWN, "??",
X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
{ 0x11, 0x03, 0x03, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_11_REV_B, "B",
X86_UARCHREV_AMD_LEGACY, A_SKTS_3 },
{ 0x11, 0x00, 0xff, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_11_UNKNOWN, "??",
X86_UARCHREV_AMD_LEGACY, A_SKTS_3 },
{ 0x12, 0x01, 0x01, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_12_REV_B, "B",
X86_UARCHREV_AMD_LEGACY, A_SKTS_4 },
{ 0x12, 0x00, 0x00, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_12_UNKNOWN, "??",
X86_UARCHREV_AMD_LEGACY, A_SKTS_4 },
{ 0x14, 0x01, 0x01, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_14_REV_B, "B",
X86_UARCHREV_AMD_LEGACY, A_SKTS_5 },
{ 0x14, 0x02, 0x02, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_14_REV_C, "C",
X86_UARCHREV_AMD_LEGACY, A_SKTS_5 },
{ 0x14, 0x00, 0xff, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_14_UNKNOWN, "??",
X86_UARCHREV_AMD_LEGACY, A_SKTS_5 },
{ 0x15, 0x01, 0x01, 0x2, 0x2, X86_CHIPREV_AMD_OROCHI_REV_B2, "OR-B2",
X86_UARCHREV_AMD_LEGACY, A_SKTS_6 },
{ 0x15, 0x02, 0x02, 0x0, 0x0, X86_CHIPREV_AMD_OROCHI_REV_C0, "OR-C0",
X86_UARCHREV_AMD_LEGACY, A_SKTS_6 },
{ 0x15, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_OROCHI_UNKNOWN, "OR-??",
X86_UARCHREV_AMD_LEGACY, A_SKTS_6 },
{ 0x15, 0x10, 0x10, 0x1, 0x1, X86_CHIPREV_AMD_TRINITY_REV_A1, "TN-A1",
X86_UARCHREV_AMD_LEGACY, A_SKTS_7 },
{ 0x15, 0x10, 0x1f, 0x0, 0xf, X86_CHIPREV_AMD_TRINITY_UNKNOWN, "TN-??",
X86_UARCHREV_AMD_LEGACY, A_SKTS_7 },
{ 0x15, 0x30, 0x30, 0x1, 0x1, X86_CHIPREV_AMD_KAVERI_REV_A1, "KV-A1",
X86_UARCHREV_AMD_LEGACY, A_SKTS_8 },
{ 0x15, 0x30, 0x3f, 0x0, 0xf, X86_CHIPREV_AMD_KAVERI_UNKNOWN, "KV-??",
X86_UARCHREV_AMD_LEGACY, A_SKTS_8 },
{ 0x15, 0x60, 0x60, 0x0, 0x0, X86_CHIPREV_AMD_CARRIZO_REV_A0, "CZ-A0",
X86_UARCHREV_AMD_LEGACY, A_SKTS_9 },
{ 0x15, 0x60, 0x60, 0x1, 0x1, X86_CHIPREV_AMD_CARRIZO_REV_A1, "CZ-A1",
X86_UARCHREV_AMD_LEGACY, A_SKTS_9 },
{ 0x15, 0x65, 0x65, 0x1, 0x1, X86_CHIPREV_AMD_CARRIZO_REV_DDR4,
"CZ-DDR4", X86_UARCHREV_AMD_LEGACY, A_SKTS_9 },
{ 0x15, 0x60, 0x6f, 0x0, 0xf, X86_CHIPREV_AMD_CARRIZO_UNKNOWN, "CZ-??",
X86_UARCHREV_AMD_LEGACY, A_SKTS_9 },
{ 0x15, 0x70, 0x70, 0x0, 0x0, X86_CHIPREV_AMD_STONEY_RIDGE_REV_A0,
"ST-A0", X86_UARCHREV_AMD_LEGACY, A_SKTS_10 },
{ 0x15, 0x70, 0x7f, 0x0, 0xf, X86_CHIPREV_AMD_STONEY_RIDGE_UNKNOWN,
"ST-??", X86_UARCHREV_AMD_LEGACY, A_SKTS_10 },
{ 0x16, 0x00, 0x00, 0x1, 0x1, X86_CHIPREV_AMD_KABINI_A1, "KB-A1",
X86_UARCHREV_AMD_LEGACY, A_SKTS_11 },
{ 0x16, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_KABINI_UNKNOWN, "KB-??",
X86_UARCHREV_AMD_LEGACY, A_SKTS_11 },
{ 0x16, 0x30, 0x30, 0x1, 0x1, X86_CHIPREV_AMD_MULLINS_A1, "ML-A1",
X86_UARCHREV_AMD_LEGACY, A_SKTS_12 },
{ 0x16, 0x30, 0x3f, 0x0, 0xf, X86_CHIPREV_AMD_MULLINS_UNKNOWN, "ML-??",
X86_UARCHREV_AMD_LEGACY, A_SKTS_12 },
{ 0x17, 0x00, 0x00, 0x0, 0x0, X86_CHIPREV_AMD_NAPLES_A0, "ZP-A0",
X86_UARCHREV_AMD_ZEN1, A_SKTS_NAPLES },
{ 0x17, 0x01, 0x01, 0x1, 0x1, X86_CHIPREV_AMD_NAPLES_B1, "ZP-B1",
X86_UARCHREV_AMD_ZEN1, A_SKTS_NAPLES },
{ 0x17, 0x01, 0x01, 0x2, 0x2, X86_CHIPREV_AMD_NAPLES_B2, "ZP-B2",
X86_UARCHREV_AMD_ZEN1, A_SKTS_NAPLES },
{ 0x17, 0x00, 0x07, 0x0, 0xf, X86_CHIPREV_AMD_NAPLES_UNKNOWN, "ZP-??",
X86_UARCHREV_AMD_ZEN1, A_SKTS_NAPLES },
{ 0x17, 0x08, 0x08, 0x2, 0x2, X86_CHIPREV_AMD_PINNACLE_RIDGE_B2,
"PiR-B2", X86_UARCHREV_AMD_ZENPLUS, A_SKTS_NAPLES },
{ 0x17, 0x08, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_PINNACLE_RIDGE_UNKNOWN,
"PiR-??", X86_UARCHREV_AMD_ZENPLUS, A_SKTS_NAPLES },
{ 0x17, 0x11, 0x11, 0x0, 0x0, X86_CHIPREV_AMD_RAVEN_RIDGE_B0,
"RV-B0", X86_UARCHREV_AMD_ZEN1, A_SKTS_RAVEN },
{ 0x17, 0x11, 0x11, 0x1, 0x1, X86_CHIPREV_AMD_RAVEN_RIDGE_B1,
"RV-B1", X86_UARCHREV_AMD_ZEN1, A_SKTS_RAVEN },
{ 0x17, 0x10, 0x17, 0x0, 0xf, X86_CHIPREV_AMD_RAVEN_RIDGE_UNKNOWN,
"RV-??", X86_UARCHREV_AMD_ZEN1, A_SKTS_RAVEN },
{ 0x17, 0x18, 0x18, 0x1, 0x1, X86_CHIPREV_AMD_PICASSO_B1, "PCO-B1",
X86_UARCHREV_AMD_ZENPLUS, A_SKTS_RAVEN },
{ 0x17, 0x18, 0x1f, 0x0, 0xf, X86_CHIPREV_AMD_PICASSO_UNKNOWN, "PCO-??",
X86_UARCHREV_AMD_ZENPLUS, A_SKTS_RAVEN },
{ 0x17, 0x20, 0x20, 0x1, 0x1, X86_CHIPREV_AMD_DALI_A1, "RV2X-A1",
X86_UARCHREV_AMD_ZEN1, A_SKTS_RAVEN },
{ 0x17, 0x20, 0x2f, 0x0, 0xf, X86_CHIPREV_AMD_DALI_UNKNOWN, "RV2X-??",
X86_UARCHREV_AMD_ZEN1, A_SKTS_RAVEN },
{ 0x17, 0x30, 0x30, 0x0, 0x0, X86_CHIPREV_AMD_ROME_A0, "SSP-A0",
X86_UARCHREV_AMD_ZEN2_A0, A_SKTS_ROME },
{ 0x17, 0x31, 0x31, 0x0, 0x0, X86_CHIPREV_AMD_ROME_B0, "SSP-B0",
X86_UARCHREV_AMD_ZEN2_B0, A_SKTS_ROME },
{ 0x17, 0x30, 0x3f, 0x0, 0xf, X86_CHIPREV_AMD_ROME_UNKNOWN, "SSP-??",
X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_ROME },
{ 0x17, 0x60, 0x60, 0x1, 0x1, X86_CHIPREV_AMD_RENOIR_A1, "RN-A1",
X86_UARCHREV_AMD_ZEN2_B0, A_SKTS_RENOIR },
{ 0x17, 0x60, 0x67, 0x0, 0xf, X86_CHIPREV_AMD_RENOIR_UNKNOWN, "RN-??",
X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_RENOIR },
{ 0x17, 0x68, 0x68, 0x1, 0x1, X86_CHIPREV_AMD_RENOIR_LCN_A1, "LCN-A1",
X86_UARCHREV_AMD_ZEN2_B0, A_SKTS_RENOIR },
{ 0x17, 0x68, 0x6f, 0x0, 0xf, X86_CHIPREV_AMD_RENOIR_UNKNOWN, "LCN-??",
X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_RENOIR },
{ 0x17, 0x71, 0x71, 0x0, 0x0, X86_CHIPREV_AMD_MATISSE_B0, "MTS-B0",
X86_UARCHREV_AMD_ZEN2_B0, A_SKTS_MATISSE },
{ 0x17, 0x70, 0x7f, 0x0, 0xf, X86_CHIPREV_AMD_MATISSE_UNKNOWN, "MTS-??",
X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_MATISSE },
{ 0x17, 0x90, 0x97, 0x0, 0xf, X86_CHIPREV_AMD_VAN_GOGH_UNKNOWN, "??",
X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_VANGOGH },
{ 0x17, 0x98, 0x9f, 0x0, 0xf, X86_CHIPREV_AMD_VAN_GOGH_UNKNOWN, "??",
X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_UNKNOWN },
{ 0x17, 0xa0, 0xaf, 0x0, 0xf, X86_CHIPREV_AMD_MENDOCINO_UNKNOWN, "??",
X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_MENDOCINO },
{ 0x18, 0x00, 0x00, 0x1, 0x1, X86_CHIPREV_HYGON_DHYANA_A1, "DN_A1",
X86_UARCHREV_AMD_ZEN1, A_SKTS_DHYANA },
{ 0x18, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_HYGON_DHYANA_UNKNOWN, "DN_??",
X86_UARCHREV_AMD_ZEN1, A_SKTS_DHYANA },
{ 0x19, 0x00, 0x00, 0x0, 0x0, X86_CHIPREV_AMD_MILAN_A0, "GN-A0",
X86_UARCHREV_AMD_ZEN3_A0, A_SKTS_MILAN },
{ 0x19, 0x01, 0x01, 0x0, 0x0, X86_CHIPREV_AMD_MILAN_B0, "GN-B0",
X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_MILAN },
{ 0x19, 0x01, 0x01, 0x1, 0x1, X86_CHIPREV_AMD_MILAN_B1, "GN-B1",
X86_UARCHREV_AMD_ZEN3_B1, A_SKTS_MILAN },
{ 0x19, 0x01, 0x01, 0x2, 0x2, X86_CHIPREV_AMD_MILAN_B2, "GN-B2",
X86_UARCHREV_AMD_ZEN3_B2, A_SKTS_MILAN },
{ 0x19, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_MILAN_UNKNOWN, "GN-??",
X86_UARCHREV_AMD_ZEN3_UNKNOWN, A_SKTS_MILAN },
{ 0x19, 0x10, 0x10, 0x0, 0x0, X86_CHIPREV_AMD_GENOA_A0, "RS-A0",
X86_UARCHREV_AMD_ZEN4_A0, A_SKTS_GENOA },
{ 0x19, 0x10, 0x10, 0x1, 0x1, X86_CHIPREV_AMD_GENOA_A1, "RS-A1",
X86_UARCHREV_AMD_ZEN4_A0, A_SKTS_GENOA },
{ 0x19, 0x11, 0x11, 0x0, 0x0, X86_CHIPREV_AMD_GENOA_B0, "RS-B0",
X86_UARCHREV_AMD_ZEN4_B0, A_SKTS_GENOA },
{ 0x19, 0x11, 0x11, 0x1, 0x1, X86_CHIPREV_AMD_GENOA_B1, "RS-B1",
X86_UARCHREV_AMD_ZEN4_B1, A_SKTS_GENOA },
{ 0x19, 0x10, 0x1f, 0x0, 0xf, X86_CHIPREV_AMD_GENOA_UNKNOWN, "RS-??",
X86_UARCHREV_AMD_ZEN4_UNKNOWN, A_SKTS_GENOA },
{ 0x19, 0x20, 0x20, 0x0, 0x0, X86_CHIPREV_AMD_VERMEER_A0, "VMR-A0",
X86_UARCHREV_AMD_ZEN3_A0, A_SKTS_VERMEER },
{ 0x19, 0x21, 0x21, 0x0, 0x0, X86_CHIPREV_AMD_VERMEER_B0, "VMR-B0",
X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_VERMEER },
{ 0x19, 0x21, 0x21, 0x2, 0x2, X86_CHIPREV_AMD_VERMEER_B2, "VMR-B2",
X86_UARCHREV_AMD_ZEN3_B2, A_SKTS_VERMEER },
{ 0x19, 0x20, 0x2f, 0x0, 0xf, X86_CHIPREV_AMD_VERMEER_UNKNOWN, "VMR-??",
X86_UARCHREV_AMD_ZEN3_UNKNOWN, A_SKTS_VERMEER },
{ 0x19, 0x40, 0x40, 0x0, 0x0, X86_CHIPREV_AMD_REMBRANDT_A0, "RMB-A0",
X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_REMBRANDT },
{ 0x19, 0x44, 0x44, 0x0, 0x0, X86_CHIPREV_AMD_REMBRANDT_B0, "RMB-B0",
X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_REMBRANDT },
{ 0x19, 0x44, 0x44, 0x1, 0x1, X86_CHIPREV_AMD_REMBRANDT_B1, "RMB-B1",
X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_REMBRANDT },
{ 0x19, 0x40, 0x4f, 0x0, 0xf, X86_CHIPREV_AMD_REMBRANDT_UNKNOWN,
"RMB-??", X86_UARCHREV_AMD_ZEN3_UNKNOWN, A_SKTS_REMBRANDT },
{ 0x19, 0x50, 0x50, 0x0, 0x0, X86_CHIPREV_AMD_CEZANNE_A0, "CZN-A0",
X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_CEZANNE },
{ 0x19, 0x50, 0x5f, 0x0, 0xf, X86_CHIPREV_AMD_CEZANNE_UNKNOWN, "CZN-??",
X86_UARCHREV_AMD_ZEN3_UNKNOWN, A_SKTS_CEZANNE },
{ 0x19, 0x61, 0x61, 0x2, 0x2, X86_CHIPREV_AMD_RAPHAEL_B2, "RPL-B2",
X86_UARCHREV_AMD_ZEN4_B2, A_SKTS_RAPHAEL },
{ 0x19, 0x60, 0x6f, 0x0, 0xf, X86_CHIPREV_AMD_RAPHAEL_UNKNOWN, "RPL-??",
X86_UARCHREV_AMD_ZEN4_UNKNOWN, A_SKTS_RAPHAEL },
{ 0x19, 0x74, 0x74, 0x1, 0x1, X86_CHIPREV_AMD_PHOENIX_A1, "PHX-A1",
X86_UARCHREV_AMD_ZEN4_A1, A_SKTS_PHOENIX },
{ 0x19, 0x78, 0x78, 0x0, 0x0, X86_CHIPREV_AMD_PHOENIX_A1, "PHX2-A0",
X86_UARCHREV_AMD_ZEN4_A1, A_SKTS_PHOENIX },
{ 0x19, 0x7C, 0x7C, 0x0, 0x0, X86_CHIPREV_AMD_PHOENIX_A1, "HPT2-A0",
X86_UARCHREV_AMD_ZEN4_A1, A_SKTS_PHOENIX },
{ 0x19, 0x70, 0x7f, 0x0, 0xf, X86_CHIPREV_AMD_PHOENIX_UNKNOWN, "PHX-??",
X86_UARCHREV_AMD_ZEN4_UNKNOWN, A_SKTS_PHOENIX },
{ 0x19, 0xa0, 0xaf, 0x0, 0x0, X86_CHIPREV_AMD_BERGAMO_A0, "RSDN-A0",
X86_UARCHREV_AMD_ZEN4_A0, A_SKTS_BERGAMO },
{ 0x19, 0xa0, 0xaf, 0x1, 0x1, X86_CHIPREV_AMD_BERGAMO_A1, "RSDN-A1",
X86_UARCHREV_AMD_ZEN4_A1, A_SKTS_BERGAMO },
{ 0x19, 0xa0, 0xaf, 0x2, 0x2, X86_CHIPREV_AMD_BERGAMO_A2, "RSDN-A2",
X86_UARCHREV_AMD_ZEN4_A2, A_SKTS_BERGAMO },
{ 0x19, 0xa0, 0xaf, 0x0, 0xf, X86_CHIPREV_AMD_BERGAMO_UNKNOWN, "???",
X86_UARCHREV_AMD_ZEN4_UNKNOWN, A_SKTS_BERGAMO },
{ 0x1a, 0x00, 0x00, 0x0, 0x0, X86_CHIPREV_AMD_TURIN_A0, "BRH-A0",
X86_UARCHREV_AMD_ZEN5_A0, A_SKTS_TURIN },
{ 0x1a, 0x01, 0x01, 0x0, 0x0, X86_CHIPREV_AMD_TURIN_B0, "BRH-B0",
X86_UARCHREV_AMD_ZEN5_A0, A_SKTS_TURIN },
{ 0x1a, 0x01, 0x01, 0x1, 0x1, X86_CHIPREV_AMD_TURIN_B1, "BRH-B1",
X86_UARCHREV_AMD_ZEN5_B0, A_SKTS_TURIN },
{ 0x1a, 0x02, 0x02, 0x0, 0x0, X86_CHIPREV_AMD_TURIN_C0, "BRH-C0",
X86_UARCHREV_AMD_ZEN5_C0, A_SKTS_TURIN },
{ 0x1a, 0x02, 0x02, 0x1, 0x1, X86_CHIPREV_AMD_TURIN_C1, "BRH-C1",
X86_UARCHREV_AMD_ZEN5_C1, A_SKTS_TURIN },
{ 0x1a, 0x08, 0x08, 0x0, 0x0, X86_CHIPREV_AMD_SHIMADA_PEAK_C0,
"SHP-C0", X86_UARCHREV_AMD_ZEN5_C0, A_SKTS_SHIMADA_PEAK },
{ 0x1a, 0x08, 0x08, 0x1, 0x1, X86_CHIPREV_AMD_SHIMADA_PEAK_C1,
"SHP-C1", X86_UARCHREV_AMD_ZEN5_C1, A_SKTS_SHIMADA_PEAK },
{ 0x1a, 0x08, 0x08, 0x0, 0xf, X86_CHIPREV_AMD_SHIMADA_PEAK_UNKNOWN,
"SHP-???", X86_UARCHREV_AMD_ZEN5_UNKNOWN, A_SKTS_SHIMADA_PEAK },
{ 0x1a, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_TURIN_UNKNOWN, "BRH-???",
X86_UARCHREV_AMD_ZEN5_UNKNOWN, A_SKTS_TURIN },
{ 0x1a, 0x10, 0x10, 0x0, 0x0, X86_CHIPREV_AMD_DENSE_TURIN_A0,
"BRHD-A0", X86_UARCHREV_AMD_ZEN5_A0, A_SKTS_TURIN },
{ 0x1a, 0x11, 0x11, 0x0, 0x0, X86_CHIPREV_AMD_DENSE_TURIN_B0,
"BRHD-B0", X86_UARCHREV_AMD_ZEN5_B0, A_SKTS_TURIN },
{ 0x1a, 0x11, 0x11, 0x1, 0x1, X86_CHIPREV_AMD_DENSE_TURIN_B1,
"BRHD-B1", X86_UARCHREV_AMD_ZEN5_B0, A_SKTS_TURIN },
{ 0x1a, 0x10, 0x1f, 0x0, 0xf, X86_CHIPREV_AMD_DENSE_TURIN_UNKNOWN,
"BRHD-???", X86_UARCHREV_AMD_ZEN5_UNKNOWN, A_SKTS_TURIN },
{ 0x1a, 0x24, 0x24, 0x0, 0x0, X86_CHIPREV_AMD_STRIX_B0,
"STX-B0", X86_UARCHREV_AMD_ZEN5_B0, A_SKTS_STRIX },
{ 0x1a, 0x20, 0x2f, 0x0, 0xf, X86_CHIPREV_AMD_STRIX_UNKNOWN,
"STX-???", X86_UARCHREV_AMD_ZEN5_UNKNOWN, A_SKTS_STRIX },
{ 0x1a, 0x60, 0x60, 0x0, 0x0, X86_CHIPREV_AMD_KRACKAN_A0,
"KRK-A0", X86_UARCHREV_AMD_ZEN5_A0, A_SKTS_STRIX },
{ 0x1a, 0x68, 0x68, 0x0, 0x0, X86_CHIPREV_AMD_KRACKAN_A0,
"KRK2-A0", X86_UARCHREV_AMD_ZEN5_A0, A_SKTS_STRIX },
{ 0x1a, 0x60, 0x6f, 0x0, 0xf, X86_CHIPREV_AMD_KRACKAN_UNKNOWN,
"KRK-???", X86_UARCHREV_AMD_ZEN5_UNKNOWN, A_SKTS_STRIX },
{ 0x1a, 0x44, 0x44, 0x0, 0x0, X86_CHIPREV_AMD_GRANITE_RIDGE_B0,
"GNR-B0", X86_UARCHREV_AMD_ZEN5_B0, A_SKTS_GRANITE_RIDGE },
{ 0x1a, 0x44, 0x44, 0x1, 0x1, X86_CHIPREV_AMD_GRANITE_RIDGE_B1,
"GNR-B1", X86_UARCHREV_AMD_ZEN5_B1, A_SKTS_GRANITE_RIDGE },
{ 0x1a, 0x40, 0x4f, 0x0, 0xf, X86_CHIPREV_AMD_GRANITE_RIDGE_UNKNOWN,
"GNR-???", X86_UARCHREV_AMD_ZEN5_UNKNOWN, A_SKTS_GRANITE_RIDGE },
{ 0x1a, 0x70, 0x70, 0x0, 0x0, X86_CHIPREV_AMD_STRIX_HALO_A0,
"STXH-A0", X86_UARCHREV_AMD_ZEN5_A0, A_SKTS_STRIX_HALO },
{ 0x1a, 0x70, 0x77, 0x0, 0xf, X86_CHIPREV_AMD_STRIX_HALO_UNKNOWN,
"STXH-???", X86_UARCHREV_AMD_ZEN5_UNKNOWN, A_SKTS_STRIX_HALO }
};
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);
idx = BITX(cp.cp_ebx, 31, 28);
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_info(uint_t family, uint_t model, uint_t step,
uint32_t *skt_p, x86_chiprev_t *chiprev_p, const char **chiprevstr_p,
x86_uarchrev_t *uarchrev_p)
{
const struct amd_rev_mapent *rmp;
int found = 0;
int i;
if (family < 0xf)
return;
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) {
found = 1;
break;
}
}
if (found) {
if (chiprev_p != NULL)
*chiprev_p = rmp->rm_chiprev;
if (chiprevstr_p != NULL)
*chiprevstr_p = rmp->rm_chiprevstr;
if (uarchrev_p != NULL)
*uarchrev_p = rmp->rm_uarchrev;
}
if (skt_p != NULL) {
int platform;
#ifdef __xpv
if (!is_controldom()) {
*skt_p = X86_SOCKET_UNKNOWN;
return;
}
#endif
platform = get_hwenv();
if ((platform & HW_VIRTUAL) != 0) {
*skt_p = X86_SOCKET_UNKNOWN;
return;
}
if (!found)
return;
if (family == 0xf) {
*skt_p = amd_skts[rmp->rm_sktidx][model & 0x3];
} else {
*skt_p = synth_amd_skt_cpuid(family, rmp->rm_sktidx);
}
}
}
uint32_t
_cpuid_skt(uint_t vendor, uint_t family, uint_t model, uint_t step)
{
uint32_t skt = X86_SOCKET_UNKNOWN;
switch (vendor) {
case X86_VENDOR_AMD:
case X86_VENDOR_HYGON:
synth_amd_info(family, model, step, &skt, NULL, NULL, NULL);
break;
default:
break;
}
return (skt);
}
const char *
_cpuid_sktstr(uint_t vendor, uint_t family, uint_t model, uint_t step)
{
const char *sktstr = "Unknown";
struct amd_sktmap_s *sktmapp;
uint32_t skt = X86_SOCKET_UNKNOWN;
switch (vendor) {
case X86_VENDOR_AMD:
case X86_VENDOR_HYGON:
synth_amd_info(family, model, step, &skt, NULL, NULL, NULL);
sktmapp = amd_sktmap_strs;
while (sktmapp->skt_code != X86_SOCKET_UNKNOWN) {
if (sktmapp->skt_code == skt)
break;
sktmapp++;
}
sktstr = sktmapp->sktstr;
break;
default:
break;
}
return (sktstr);
}
x86_chiprev_t
_cpuid_chiprev(uint_t vendor, uint_t family, uint_t model, uint_t step)
{
x86_chiprev_t chiprev = X86_CHIPREV_UNKNOWN;
switch (vendor) {
case X86_VENDOR_AMD:
case X86_VENDOR_HYGON:
synth_amd_info(family, model, step, NULL, &chiprev, NULL, NULL);
break;
default:
break;
}
return (chiprev);
}
x86_uarchrev_t
_cpuid_uarchrev(uint_t vendor, uint_t family, uint_t model, uint_t step)
{
x86_uarchrev_t uarchrev = X86_UARCHREV_UNKNOWN;
switch (vendor) {
case X86_VENDOR_AMD:
case X86_VENDOR_HYGON:
synth_amd_info(family, model, step, NULL, NULL, NULL,
&uarchrev);
break;
default:
break;
}
return (uarchrev);
}
const char *
_cpuid_chiprevstr(uint_t vendor, uint_t family, uint_t model, uint_t step)
{
const char *revstr = "Unknown";
switch (vendor) {
case X86_VENDOR_AMD:
case X86_VENDOR_HYGON:
synth_amd_info(family, model, step, NULL, NULL, &revstr, NULL);
break;
default:
break;
}
return (revstr);
}
uint_t
_cpuid_vendorstr_to_vendorcode(char *vendorstr)
{
if (strcmp(vendorstr, X86_VENDORSTR_Intel) == 0)
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, X86_VENDORSTR_CYRIX) == 0)
return (X86_VENDOR_Cyrix);
else if (strcmp(vendorstr, X86_VENDORSTR_UMC) == 0)
return (X86_VENDOR_UMC);
else if (strcmp(vendorstr, X86_VENDORSTR_NexGen) == 0)
return (X86_VENDOR_NexGen);
else if (strcmp(vendorstr, X86_VENDORSTR_Centaur) == 0)
return (X86_VENDOR_Centaur);
else if (strcmp(vendorstr, X86_VENDORSTR_Rise) == 0)
return (X86_VENDOR_Rise);
else if (strcmp(vendorstr, X86_VENDORSTR_SiS) == 0)
return (X86_VENDOR_SiS);
else if (strcmp(vendorstr, X86_VENDORSTR_NSC) == 0)
return (X86_VENDOR_NSC);
else
return (X86_VENDOR_IntelClone);
}