xref: /illumos-gate/usr/src/uts/intel/os/cpuid_subr.c (revision 019df03d)
1e4b86885SCheng Sean Ye /*
2e4b86885SCheng Sean Ye  * CDDL HEADER START
3e4b86885SCheng Sean Ye  *
4e4b86885SCheng Sean Ye  * The contents of this file are subject to the terms of the
5e4b86885SCheng Sean Ye  * Common Development and Distribution License (the "License").
6e4b86885SCheng Sean Ye  * You may not use this file except in compliance with the License.
7e4b86885SCheng Sean Ye  *
8e4b86885SCheng Sean Ye  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e4b86885SCheng Sean Ye  * or http://www.opensolaris.org/os/licensing.
10e4b86885SCheng Sean Ye  * See the License for the specific language governing permissions
11e4b86885SCheng Sean Ye  * and limitations under the License.
12e4b86885SCheng Sean Ye  *
13e4b86885SCheng Sean Ye  * When distributing Covered Code, include this CDDL HEADER in each
14e4b86885SCheng Sean Ye  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15e4b86885SCheng Sean Ye  * If applicable, add the following below this CDDL HEADER, with the
16e4b86885SCheng Sean Ye  * fields enclosed by brackets "[]" replaced with your own identifying
17e4b86885SCheng Sean Ye  * information: Portions Copyright [yyyy] [name of copyright owner]
18e4b86885SCheng Sean Ye  *
19e4b86885SCheng Sean Ye  * CDDL HEADER END
20e4b86885SCheng Sean Ye  */
21e4b86885SCheng Sean Ye 
22e4b86885SCheng Sean Ye /*
2389e921d5SKuriakose Kuruvilla  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24e4b86885SCheng Sean Ye  * Use is subject to license terms.
2579ec9da8SYuri Pankov  *
2679ec9da8SYuri Pankov  * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
27e4b86885SCheng Sean Ye  */
28e4b86885SCheng Sean Ye 
2989e921d5SKuriakose Kuruvilla /*
3089e921d5SKuriakose Kuruvilla  * Portions Copyright 2009 Advanced Micro Devices, Inc.
3189e921d5SKuriakose Kuruvilla  */
3289e921d5SKuriakose Kuruvilla 
3379321794SJens Elkner /*
3479321794SJens Elkner  * Copyright 2012 Jens Elkner <jel+illumos@cs.uni-magdeburg.de>
3579321794SJens Elkner  * Copyright 2012 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
36c0692105SRobert Mustacchi  * Copyright 2019 Joyent, Inc.
37f32e173eSLuqman Aden  * Copyright 2024 Oxide Computer Company
3879321794SJens Elkner  */
3979321794SJens Elkner 
40e4b86885SCheng Sean Ye /*
41e4b86885SCheng Sean Ye  * Support functions that interpret CPUID and similar information.
42e4b86885SCheng Sean Ye  * These should not be used from anywhere other than cpuid.c and
43e4b86885SCheng Sean Ye  * cmi_hw.c - as such we will not list them in any header file
44e4b86885SCheng Sean Ye  * such as x86_archext.h.
45e4b86885SCheng Sean Ye  *
46e4b86885SCheng Sean Ye  * In cpuid.c we process CPUID information for each cpu_t instance
47e4b86885SCheng Sean Ye  * we're presented with, and stash this raw information and material
48e4b86885SCheng Sean Ye  * derived from it in per-cpu_t structures.
49e4b86885SCheng Sean Ye  *
50e4b86885SCheng Sean Ye  * If we are virtualized then the CPUID information derived from CPUID
51e4b86885SCheng Sean Ye  * instructions executed in the guest is based on whatever the hypervisor
52e4b86885SCheng Sean Ye  * wanted to make things look like, and the cpu_t are not necessarily in 1:1
53e4b86885SCheng Sean Ye  * or fixed correspondence with real processor execution resources.  In cmi_hw.c
54e4b86885SCheng Sean Ye  * we are interested in the native properties of a processor - for fault
55e4b86885SCheng Sean Ye  * management (and potentially other, such as power management) purposes;
56e4b86885SCheng Sean Ye  * it will tunnel through to real hardware information, and use the
57e4b86885SCheng Sean Ye  * functionality provided in this file to process it.
58e4b86885SCheng Sean Ye  */
59e4b86885SCheng Sean Ye 
60e4b86885SCheng Sean Ye #include <sys/types.h>
61e4b86885SCheng Sean Ye #include <sys/systm.h>
6289e921d5SKuriakose Kuruvilla #include <sys/bitmap.h>
63e4b86885SCheng Sean Ye #include <sys/x86_archext.h>
6489e921d5SKuriakose Kuruvilla #include <sys/pci_cfgspace.h>
65a41862fcSRobert Mustacchi #include <sys/sysmacros.h>
6689e921d5SKuriakose Kuruvilla #ifdef __xpv
6789e921d5SKuriakose Kuruvilla #include <sys/hypervisor.h>
6889e921d5SKuriakose Kuruvilla #endif
69e4b86885SCheng Sean Ye 
70e4b86885SCheng Sean Ye /*
7189e921d5SKuriakose Kuruvilla  * AMD socket types.
7222e4c3acSKeith M Wesolowski  * First index defines a processor family; see notes inline.  The second index
7322e4c3acSKeith M Wesolowski  * selects the socket type by either (model & 0x3) for family 0fh or the CPUID
7422e4c3acSKeith M Wesolowski  * pkg bits (Fn8000_0001_EBX[31:28]) for later families.
75e4b86885SCheng Sean Ye  */
76f95a9494SRobert Mustacchi static uint32_t amd_skts[][16] = {
77e4b86885SCheng Sean Ye 	/*
78e4b86885SCheng Sean Ye 	 * Family 0xf revisions B through E
79e4b86885SCheng Sean Ye 	 */
80e4b86885SCheng Sean Ye #define	A_SKTS_0			0
81e4b86885SCheng Sean Ye 	{
82f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_754,
83f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_940,
84f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_754,
85f95a9494SRobert Mustacchi 		[3] = X86_SOCKET_939,
86e4b86885SCheng Sean Ye 	},
87e4b86885SCheng Sean Ye 	/*
88e4b86885SCheng Sean Ye 	 * Family 0xf revisions F and G
89e4b86885SCheng Sean Ye 	 */
90e4b86885SCheng Sean Ye #define	A_SKTS_1			1
91e4b86885SCheng Sean Ye 	{
92f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_S1g1,
93f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_F1207,
94f95a9494SRobert Mustacchi 		[3] = X86_SOCKET_AM2
95e4b86885SCheng Sean Ye 	},
96e4b86885SCheng Sean Ye 	/*
9789e921d5SKuriakose Kuruvilla 	 * Family 0x10
98e4b86885SCheng Sean Ye 	 */
99e4b86885SCheng Sean Ye #define	A_SKTS_2			2
100e4b86885SCheng Sean Ye 	{
101f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_F1207,
102f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_AM2R2,
103f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_S1g3,
104f95a9494SRobert Mustacchi 		[3] = X86_SOCKET_G34,
105f95a9494SRobert Mustacchi 		[4] = X86_SOCKET_ASB2,
106f95a9494SRobert Mustacchi 		[5] = X86_SOCKET_C32
10789e921d5SKuriakose Kuruvilla 	},
10889e921d5SKuriakose Kuruvilla 
10989e921d5SKuriakose Kuruvilla 	/*
11089e921d5SKuriakose Kuruvilla 	 * Family 0x11
11189e921d5SKuriakose Kuruvilla 	 */
11289e921d5SKuriakose Kuruvilla #define	A_SKTS_3			3
11389e921d5SKuriakose Kuruvilla 	{
114f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_S1g2
11579321794SJens Elkner 	},
11679321794SJens Elkner 
11779321794SJens Elkner 	/*
11879321794SJens Elkner 	 * Family 0x12
11979321794SJens Elkner 	 */
12079321794SJens Elkner #define	A_SKTS_4			4
12179321794SJens Elkner 	{
122f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_FS1,
123f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_FM1
12479321794SJens Elkner 	},
12579321794SJens Elkner 
12679321794SJens Elkner 	/*
12779321794SJens Elkner 	 * Family 0x14
12879321794SJens Elkner 	 */
12979321794SJens Elkner #define	A_SKTS_5			5
13079321794SJens Elkner 	{
131f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_FT1
13279321794SJens Elkner 	},
13379321794SJens Elkner 
13479321794SJens Elkner 	/*
13579321794SJens Elkner 	 * Family 0x15 models 00 - 0f
13679321794SJens Elkner 	 */
13779321794SJens Elkner #define	A_SKTS_6			6
13879321794SJens Elkner 	{
139f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_AM3R2,
140f95a9494SRobert Mustacchi 		[3] = X86_SOCKET_G34,
141f95a9494SRobert Mustacchi 		[5] = X86_SOCKET_C32
14279321794SJens Elkner 	},
14379321794SJens Elkner 
14479321794SJens Elkner 	/*
14579321794SJens Elkner 	 * Family 0x15 models 10 - 1f
14679321794SJens Elkner 	 */
14779321794SJens Elkner #define	A_SKTS_7			7
14879321794SJens Elkner 	{
149f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_FP2,
150f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_FS1R2,
151f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_FM2
15279321794SJens Elkner 	},
15379321794SJens Elkner 
1542ce06f32SRobert Mustacchi 	/*
1552ce06f32SRobert Mustacchi 	 * Family 0x15 models 30-3f
1562ce06f32SRobert Mustacchi 	 */
1572ce06f32SRobert Mustacchi #define	A_SKTS_8			8
1582ce06f32SRobert Mustacchi 	{
159f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_FP3,
160f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_FM2R2
1612ce06f32SRobert Mustacchi 	},
1622ce06f32SRobert Mustacchi 
1632ce06f32SRobert Mustacchi 	/*
1642ce06f32SRobert Mustacchi 	 * Family 0x15 models 60-6f
1652ce06f32SRobert Mustacchi 	 */
1662ce06f32SRobert Mustacchi #define	A_SKTS_9			9
1672ce06f32SRobert Mustacchi 	{
168f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_FP4,
169f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_AM4,
170f95a9494SRobert Mustacchi 		[3] = X86_SOCKET_FM2R2
1712ce06f32SRobert Mustacchi 	},
1722ce06f32SRobert Mustacchi 
1732ce06f32SRobert Mustacchi 	/*
1742ce06f32SRobert Mustacchi 	 * Family 0x15 models 70-7f
1752ce06f32SRobert Mustacchi 	 */
1762ce06f32SRobert Mustacchi #define	A_SKTS_10			10
1772ce06f32SRobert Mustacchi 	{
178f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_FP4,
179f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_AM4,
180f95a9494SRobert Mustacchi 		[4] = X86_SOCKET_FT4
1812ce06f32SRobert Mustacchi 	},
1822ce06f32SRobert Mustacchi 
1832ce06f32SRobert Mustacchi 	/*
1842ce06f32SRobert Mustacchi 	 * Family 0x16 models 00-0f
1852ce06f32SRobert Mustacchi 	 */
1862ce06f32SRobert Mustacchi #define	A_SKTS_11			11
1872ce06f32SRobert Mustacchi 	{
188f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_FT3,
189f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_FS1B
1902ce06f32SRobert Mustacchi 	},
1912ce06f32SRobert Mustacchi 
1922ce06f32SRobert Mustacchi 	/*
1932ce06f32SRobert Mustacchi 	 * Family 0x16 models 30-3f
1942ce06f32SRobert Mustacchi 	 */
1952ce06f32SRobert Mustacchi #define	A_SKTS_12			12
1962ce06f32SRobert Mustacchi 	{
197f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_FT3B,
198f95a9494SRobert Mustacchi 		[3] = X86_SOCKET_FP4
1992ce06f32SRobert Mustacchi 	},
2002ce06f32SRobert Mustacchi 
2012ce06f32SRobert Mustacchi 	/*
202c0692105SRobert Mustacchi 	 * Family 0x17 models 00-0f	(Zen 1 - Naples, Ryzen)
2032ce06f32SRobert Mustacchi 	 */
204f95a9494SRobert Mustacchi #define	A_SKTS_NAPLES			13
2052ce06f32SRobert Mustacchi 	{
206f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_AM4,
207f95a9494SRobert Mustacchi 		[4] = X86_SOCKET_SP3,
208f95a9494SRobert Mustacchi 		[7] = X86_SOCKET_SP3R2
2092ce06f32SRobert Mustacchi 	},
2102ce06f32SRobert Mustacchi 
211c0692105SRobert Mustacchi 	/*
212a41862fcSRobert Mustacchi 	 * Family 0x17 models 10-2f	(Zen 1 - APU: Raven Ridge)
213a41862fcSRobert Mustacchi 	 *				(Zen 1 - APU: Banded Kestrel)
214a41862fcSRobert Mustacchi 	 *				(Zen 1 - APU: Dali)
215c0692105SRobert Mustacchi 	 */
216f95a9494SRobert Mustacchi #define	A_SKTS_RAVEN			14
217c0692105SRobert Mustacchi 	{
218f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_FP5,
219f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_AM4
220c0692105SRobert Mustacchi 	},
221c0692105SRobert Mustacchi 
222c0692105SRobert Mustacchi 	/*
223c0692105SRobert Mustacchi 	 * Family 0x17 models 30-3f	(Zen 2 - Rome)
224c0692105SRobert Mustacchi 	 */
225f95a9494SRobert Mustacchi #define	A_SKTS_ROME			15
226c0692105SRobert Mustacchi 	{
227f95a9494SRobert Mustacchi 		[4] = X86_SOCKET_SP3,
228f95a9494SRobert Mustacchi 		[7] = X86_SOCKET_SP3R2
229c0692105SRobert Mustacchi 	},
230c0692105SRobert Mustacchi 
231c0692105SRobert Mustacchi 	/*
232a41862fcSRobert Mustacchi 	 * Family 0x17 models 60-6f	(Zen 2 - Renoir)
233c0692105SRobert Mustacchi 	 */
234f95a9494SRobert Mustacchi #define	A_SKTS_RENOIR			16
235a41862fcSRobert Mustacchi 	{
236f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_FP6,
237f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_AM4
238a41862fcSRobert Mustacchi 	},
239a41862fcSRobert Mustacchi 
240a41862fcSRobert Mustacchi 	/*
241a41862fcSRobert Mustacchi 	 * Family 0x17 models 70-7f	(Zen 2 - Matisse)
242a41862fcSRobert Mustacchi 	 */
243f95a9494SRobert Mustacchi #define	A_SKTS_MATISSE			17
244c0692105SRobert Mustacchi 	{
245f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_AM4,
246c0692105SRobert Mustacchi 	},
247059f0700SRobert Mustacchi 
248059f0700SRobert Mustacchi 	/*
2499b0429a1SPu Wen 	 * Family 0x18 models 00-0f	(Dhyana)
250059f0700SRobert Mustacchi 	 */
251f95a9494SRobert Mustacchi #define	A_SKTS_DHYANA			18
2529b0429a1SPu Wen 	{
253f95a9494SRobert Mustacchi 		[4] = X86_SOCKET_SL1,
254f95a9494SRobert Mustacchi 		[6] = X86_SOCKET_DM1,
255f95a9494SRobert Mustacchi 		[7] = X86_SOCKET_SL1R2
2569b0429a1SPu Wen 	},
2579b0429a1SPu Wen 
2589b0429a1SPu Wen 	/*
2599b0429a1SPu Wen 	 * Family 0x19 models 00-0f	(Zen 3 - Milan)
2609b0429a1SPu Wen 	 */
261f95a9494SRobert Mustacchi #define	A_SKTS_MILAN			19
262059f0700SRobert Mustacchi 	{
263f95a9494SRobert Mustacchi 		[4] = X86_SOCKET_SP3,
264f95a9494SRobert Mustacchi 		[7] = X86_SOCKET_STRX4
265059f0700SRobert Mustacchi 	},
266059f0700SRobert Mustacchi 
267059f0700SRobert Mustacchi 	/*
268059f0700SRobert Mustacchi 	 * Family 0x19 models 20-2f	(Zen 3 - Vermeer)
269059f0700SRobert Mustacchi 	 */
270f95a9494SRobert Mustacchi #define	A_SKTS_VERMEER			20
271059f0700SRobert Mustacchi 	{
272f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_AM4,
27364168f2bSRobert Mustacchi 	},
27464168f2bSRobert Mustacchi 
27564168f2bSRobert Mustacchi 	/*
27664168f2bSRobert Mustacchi 	 * Family 0x19 models 50-5f	(Zen 3 - Cezanne)
27764168f2bSRobert Mustacchi 	 */
278f95a9494SRobert Mustacchi #define	A_SKTS_CEZANNE			21
27964168f2bSRobert Mustacchi 	{
280f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_FP6,
281f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_AM4
28264168f2bSRobert Mustacchi 	},
28322e4c3acSKeith M Wesolowski 
28422e4c3acSKeith M Wesolowski 	/*
28522e4c3acSKeith M Wesolowski 	 * Family 0x19 models 10-1f	(Zen 4 - Genoa)
28622e4c3acSKeith M Wesolowski 	 */
287f95a9494SRobert Mustacchi #define	A_SKTS_GENOA			22
28822e4c3acSKeith M Wesolowski 	{
289f95a9494SRobert Mustacchi 		[4] = X86_SOCKET_SP5,
290f95a9494SRobert Mustacchi 		[8] = X86_SOCKET_TR5
29122e4c3acSKeith M Wesolowski 	},
29222e4c3acSKeith M Wesolowski 
29322e4c3acSKeith M Wesolowski 	/*
29422e4c3acSKeith M Wesolowski 	 * Family 0x19 models 40-4f	(Zen 3 - Rembrandt)
29522e4c3acSKeith M Wesolowski 	 */
296f95a9494SRobert Mustacchi #define	A_SKTS_REMBRANDT			23
29722e4c3acSKeith M Wesolowski 	{
298f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_AM5,
299f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_FP7,
300f95a9494SRobert Mustacchi 		[2] = X86_SOCKET_FP7R2
30122e4c3acSKeith M Wesolowski 	},
30222e4c3acSKeith M Wesolowski 
30322e4c3acSKeith M Wesolowski 	/*
30422e4c3acSKeith M Wesolowski 	 * Family 0x19 models 60-6f	(Zen 4 - Raphael)
30522e4c3acSKeith M Wesolowski 	 */
306f95a9494SRobert Mustacchi #define	A_SKTS_RAPHAEL			24
30722e4c3acSKeith M Wesolowski 	{
308f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_AM5,
309f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_FL1
31022e4c3acSKeith M Wesolowski 	},
31122e4c3acSKeith M Wesolowski 
31222e4c3acSKeith M Wesolowski 	/*
31322e4c3acSKeith M Wesolowski 	 * The always-unknown socket group, used for undocumented parts.  It
314f95a9494SRobert Mustacchi 	 * need not be last; the position is arbitrary. The default initializer
315f95a9494SRobert Mustacchi 	 * for this is zero which is x86 socket unknown.
31622e4c3acSKeith M Wesolowski 	 */
31722e4c3acSKeith M Wesolowski #define	A_SKTS_UNKNOWN			25
31822e4c3acSKeith M Wesolowski 	{
31922e4c3acSKeith M Wesolowski 	},
32022e4c3acSKeith M Wesolowski 	/*
32122e4c3acSKeith M Wesolowski 	 * Family 0x17 models 90-97	(Zen 2 - Van Gogh)
32222e4c3acSKeith M Wesolowski 	 */
323f95a9494SRobert Mustacchi #define	A_SKTS_VANGOGH			26
32422e4c3acSKeith M Wesolowski 	{
325f95a9494SRobert Mustacchi 		[3] = X86_SOCKET_FF3
326e6f89c3aSRobert Mustacchi 	},
327e6f89c3aSRobert Mustacchi 	/*
328e6f89c3aSRobert Mustacchi 	 * Family 0x17 models a0-af	(Zen 2 - Mendocino)
329e6f89c3aSRobert Mustacchi 	 */
330f95a9494SRobert Mustacchi #define	A_SKTS_MENDOCINO			27
331e6f89c3aSRobert Mustacchi 	{
332f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_FT6
333e6f89c3aSRobert Mustacchi 	},
334e6f89c3aSRobert Mustacchi 
335e6f89c3aSRobert Mustacchi 	/*
336e6f89c3aSRobert Mustacchi 	 * Family 0x19 models 70-7f	(Zen 4 - Phoenix)
337e6f89c3aSRobert Mustacchi 	 */
338f95a9494SRobert Mustacchi #define	A_SKTS_PHOENIX			28
339e6f89c3aSRobert Mustacchi 	{
340f95a9494SRobert Mustacchi 		[0] = X86_SOCKET_AM5,
341f95a9494SRobert Mustacchi 		[1] = X86_SOCKET_FP8,
342f95a9494SRobert Mustacchi 		[4] = X86_SOCKET_FP7,
343f95a9494SRobert Mustacchi 		[5] = X86_SOCKET_FP7R2,
344f95a9494SRobert Mustacchi 	},
345f95a9494SRobert Mustacchi 
346f95a9494SRobert Mustacchi 	/*
347f95a9494SRobert Mustacchi 	 * Family 0x19 models a0-af	(Zen 4c - Bergamo/Siena)
348f95a9494SRobert Mustacchi 	 */
349f95a9494SRobert Mustacchi #define	A_SKTS_BERGAMO			29
350f95a9494SRobert Mustacchi 	{
351f95a9494SRobert Mustacchi 		[4] = X86_SOCKET_SP5,
352f95a9494SRobert Mustacchi 		[8] = X86_SOCKET_SP6
353*019df03dSRobert Mustacchi 	},
354*019df03dSRobert Mustacchi 	/*
355*019df03dSRobert Mustacchi 	 * Family 0x1a models 00-1f	(Zen 5[c] - Turin)
356*019df03dSRobert Mustacchi 	 */
357*019df03dSRobert Mustacchi #define	A_SKTS_TURIN			30
358*019df03dSRobert Mustacchi 	{
359*019df03dSRobert Mustacchi 		[4] = X86_SOCKET_SP5,
36022e4c3acSKeith M Wesolowski 	}
361e4b86885SCheng Sean Ye };
362e4b86885SCheng Sean Ye 
36389e921d5SKuriakose Kuruvilla struct amd_sktmap_s {
36489e921d5SKuriakose Kuruvilla 	uint32_t	skt_code;
36589e921d5SKuriakose Kuruvilla 	char		sktstr[16];
36689e921d5SKuriakose Kuruvilla };
36722e4c3acSKeith M Wesolowski static struct amd_sktmap_s amd_sktmap_strs[] = {
36889e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_754,	"754" },
36989e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_939,	"939" },
37089e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_940,	"940" },
37189e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_S1g1,	"S1g1" },
37289e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_AM2,	"AM2" },
37389e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_F1207,	"F(1207)" },
37489e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_S1g2,	"S1g2" },
37589e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_S1g3,	"S1g3" },
37689e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_AM,	"AM" },
37789e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_AM2R2,	"AM2r2" },
37889e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_AM3,	"AM3" },
37989e921d5SKuriakose Kuruvilla 	{ X86_SOCKET_G34,	"G34" },
380bd15239eSSrihari Venkatesan 	{ X86_SOCKET_ASB2,	"ASB2" },
381bd15239eSSrihari Venkatesan 	{ X86_SOCKET_C32,	"C32" },
38222e4c3acSKeith M Wesolowski 	{ X86_SOCKET_S1g4,	"S1g4" },
38379321794SJens Elkner 	{ X86_SOCKET_FT1,	"FT1" },
38479321794SJens Elkner 	{ X86_SOCKET_FM1,	"FM1" },
38579321794SJens Elkner 	{ X86_SOCKET_FS1,	"FS1" },
38679321794SJens Elkner 	{ X86_SOCKET_AM3R2,	"AM3r2" },
38779321794SJens Elkner 	{ X86_SOCKET_FP2,	"FP2" },
38879321794SJens Elkner 	{ X86_SOCKET_FS1R2,	"FS1r2" },
38979321794SJens Elkner 	{ X86_SOCKET_FM2,	"FM2" },
3902ce06f32SRobert Mustacchi 	{ X86_SOCKET_FP3,	"FP3" },
3912ce06f32SRobert Mustacchi 	{ X86_SOCKET_FM2R2,	"FM2r2" },
3922ce06f32SRobert Mustacchi 	{ X86_SOCKET_FP4,	"FP4" },
3932ce06f32SRobert Mustacchi 	{ X86_SOCKET_AM4,	"AM4" },
3942ce06f32SRobert Mustacchi 	{ X86_SOCKET_FT3,	"FT3" },
3952ce06f32SRobert Mustacchi 	{ X86_SOCKET_FT4,	"FT4" },
3962ce06f32SRobert Mustacchi 	{ X86_SOCKET_FS1B,	"FS1b" },
3972ce06f32SRobert Mustacchi 	{ X86_SOCKET_FT3B,	"FT3b" },
3982ce06f32SRobert Mustacchi 	{ X86_SOCKET_SP3,	"SP3" },
3992ce06f32SRobert Mustacchi 	{ X86_SOCKET_SP3R2,	"SP3r2" },
400c0692105SRobert Mustacchi 	{ X86_SOCKET_FP5,	"FP5" },
401a41862fcSRobert Mustacchi 	{ X86_SOCKET_FP6,	"FP6" },
402059f0700SRobert Mustacchi 	{ X86_SOCKET_STRX4,	"sTRX4" },
4039b0429a1SPu Wen 	{ X86_SOCKET_SL1,	"SL1" },
4049b0429a1SPu Wen 	{ X86_SOCKET_SL1R2,	"SL1R2" },
4059b0429a1SPu Wen 	{ X86_SOCKET_DM1,	"DM1" },
40622e4c3acSKeith M Wesolowski 	{ X86_SOCKET_SP5,	"SP5" },
40722e4c3acSKeith M Wesolowski 	{ X86_SOCKET_AM5,	"AM5" },
40822e4c3acSKeith M Wesolowski 	{ X86_SOCKET_FP7,	"FP7" },
40922e4c3acSKeith M Wesolowski 	{ X86_SOCKET_FP7R2,	"FP7r2" },
41022e4c3acSKeith M Wesolowski 	{ X86_SOCKET_FF3,	"FF3" },
411e6f89c3aSRobert Mustacchi 	{ X86_SOCKET_FT6,	"FT6" },
412e6f89c3aSRobert Mustacchi 	{ X86_SOCKET_FP8,	"FP8" },
413e6f89c3aSRobert Mustacchi 	{ X86_SOCKET_FL1,	"FL1" },
414f95a9494SRobert Mustacchi 	{ X86_SOCKET_SP6,	"SP6" },
415f95a9494SRobert Mustacchi 	{ X86_SOCKET_TR5,	"TR5" },
41622e4c3acSKeith M Wesolowski 	{ X86_SOCKET_UNKNOWN,	"Unknown" }	/* Must be last! */
41789e921d5SKuriakose Kuruvilla };
41889e921d5SKuriakose Kuruvilla 
41922e4c3acSKeith M Wesolowski /* Keep the array above in sync with the definitions in x86_archext.h. */
42022e4c3acSKeith M Wesolowski CTASSERT(ARRAY_SIZE(amd_sktmap_strs) == X86_NUM_SOCKETS + 1);
421a41862fcSRobert Mustacchi 
422e4b86885SCheng Sean Ye /*
42322e4c3acSKeith M Wesolowski  * Table for mapping AMD family/model/stepping ranges onto three derived items:
42422e4c3acSKeith M Wesolowski  *
42522e4c3acSKeith M Wesolowski  * * The "chiprev" and associated string, which is generally the AMD silicon
42622e4c3acSKeith M Wesolowski  * revision along with a symbolic representation of the marketing (not cpuid)
42722e4c3acSKeith M Wesolowski  * family.  In line with the overall cpuid usage, we refer to this as a
42822e4c3acSKeith M Wesolowski  * processor family.
42922e4c3acSKeith M Wesolowski  * * The uarch, which is analogous to the chiprev and provides the
43022e4c3acSKeith M Wesolowski  * microarchitecture/core generation and silicon revision.  Note that this is
43122e4c3acSKeith M Wesolowski  * distinct from the package-level silicon/product revision and is often common
43222e4c3acSKeith M Wesolowski  * to multiple product lines offered at a given time.
43322e4c3acSKeith M Wesolowski  * * The socket map selector, used to translate this collection of products'
43422e4c3acSKeith M Wesolowski  * last 4 model bits (for family 0xf only) or Fn8000_0001_EBX[30:28] into a
43522e4c3acSKeith M Wesolowski  * socket ID.
436e4b86885SCheng Sean Ye  *
437e4b86885SCheng Sean Ye  * The first member of this array that matches a given family, extended model
43822e4c3acSKeith M Wesolowski  * plus model range, and stepping range will be considered a match.  This allows
43922e4c3acSKeith M Wesolowski  * us to end each cpuid family and/or processor family with a catchall that
44022e4c3acSKeith M Wesolowski  * while less specific than we might like still allows us to provide a fair
44122e4c3acSKeith M Wesolowski  * amount of detail to both other kernel consumers and userland.
442e4b86885SCheng Sean Ye  */
443e4b86885SCheng Sean Ye static const struct amd_rev_mapent {
444e4b86885SCheng Sean Ye 	uint_t rm_family;
445e4b86885SCheng Sean Ye 	uint_t rm_modello;
446e4b86885SCheng Sean Ye 	uint_t rm_modelhi;
447e4b86885SCheng Sean Ye 	uint_t rm_steplo;
448e4b86885SCheng Sean Ye 	uint_t rm_stephi;
44922e4c3acSKeith M Wesolowski 	x86_chiprev_t rm_chiprev;
450e4b86885SCheng Sean Ye 	const char *rm_chiprevstr;
45122e4c3acSKeith M Wesolowski 	x86_uarchrev_t rm_uarchrev;
452a41862fcSRobert Mustacchi 	uint_t rm_sktidx;
453e4b86885SCheng Sean Ye } amd_revmap[] = {
454e4b86885SCheng Sean Ye 	/*
455e4b86885SCheng Sean Ye 	 * =============== AuthenticAMD Family 0xf ===============
456e4b86885SCheng Sean Ye 	 */
457e4b86885SCheng Sean Ye 
458e4b86885SCheng Sean Ye 	/*
459e4b86885SCheng Sean Ye 	 * Rev B includes model 0x4 stepping 0 and model 0x5 stepping 0 and 1.
460e4b86885SCheng Sean Ye 	 */
46122e4c3acSKeith M Wesolowski 	{ 0xf, 0x04, 0x04, 0x0, 0x0, X86_CHIPREV_AMD_LEGACY_F_REV_B, "B",
46222e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
46322e4c3acSKeith M Wesolowski 	{ 0xf, 0x05, 0x05, 0x0, 0x1, X86_CHIPREV_AMD_LEGACY_F_REV_B, "B",
46422e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
465e4b86885SCheng Sean Ye 	/*
466e4b86885SCheng Sean Ye 	 * Rev C0 includes model 0x4 stepping 8 and model 0x5 stepping 8
467e4b86885SCheng Sean Ye 	 */
46822e4c3acSKeith M Wesolowski 	{ 0xf, 0x04, 0x05, 0x8, 0x8, X86_CHIPREV_AMD_LEGACY_F_REV_C0, "C0",
46922e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
470e4b86885SCheng Sean Ye 	/*
471e4b86885SCheng Sean Ye 	 * Rev CG is the rest of extended model 0x0 - i.e., everything
472e4b86885SCheng Sean Ye 	 * but the rev B and C0 combinations covered above.
473e4b86885SCheng Sean Ye 	 */
47422e4c3acSKeith M Wesolowski 	{ 0xf, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_F_REV_CG, "CG",
47522e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
476e4b86885SCheng Sean Ye 	/*
477e4b86885SCheng Sean Ye 	 * Rev D has extended model 0x1.
478e4b86885SCheng Sean Ye 	 */
47922e4c3acSKeith M Wesolowski 	{ 0xf, 0x10, 0x1f, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_F_REV_D, "D",
48022e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
481e4b86885SCheng Sean Ye 	/*
482e4b86885SCheng Sean Ye 	 * Rev E has extended model 0x2.
483e4b86885SCheng Sean Ye 	 * Extended model 0x3 is unused but available to grow into.
484e4b86885SCheng Sean Ye 	 */
48522e4c3acSKeith M Wesolowski 	{ 0xf, 0x20, 0x3f, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_F_REV_E, "E",
48622e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_0 },
487e4b86885SCheng Sean Ye 	/*
488e4b86885SCheng Sean Ye 	 * Rev F has extended models 0x4 and 0x5.
489e4b86885SCheng Sean Ye 	 */
49022e4c3acSKeith M Wesolowski 	{ 0xf, 0x40, 0x5f, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_F_REV_F, "F",
49122e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_1 },
492e4b86885SCheng Sean Ye 	/*
493e4b86885SCheng Sean Ye 	 * Rev G has extended model 0x6.
494e4b86885SCheng Sean Ye 	 */
49522e4c3acSKeith M Wesolowski 	{ 0xf, 0x60, 0x6f, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_F_REV_G, "G",
49622e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_1 },
497e4b86885SCheng Sean Ye 
498e4b86885SCheng Sean Ye 	/*
499e4b86885SCheng Sean Ye 	 * =============== AuthenticAMD Family 0x10 ===============
500e4b86885SCheng Sean Ye 	 */
501e4b86885SCheng Sean Ye 
502e4b86885SCheng Sean Ye 	/*
503e4b86885SCheng Sean Ye 	 * Rev A has model 0 and stepping 0/1/2 for DR-{A0,A1,A2}.
504e4b86885SCheng Sean Ye 	 * Give all of model 0 stepping range to rev A.
505e4b86885SCheng Sean Ye 	 */
50622e4c3acSKeith M Wesolowski 	{ 0x10, 0x00, 0x00, 0x0, 0x2, X86_CHIPREV_AMD_LEGACY_10_REV_A, "A",
50722e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
508e4b86885SCheng Sean Ye 
509e4b86885SCheng Sean Ye 	/*
510e4b86885SCheng Sean Ye 	 * Rev B has model 2 and steppings 0/1/0xa/2 for DR-{B0,B1,BA,B2}.
511e4b86885SCheng Sean Ye 	 * Give all of model 2 stepping range to rev B.
512e4b86885SCheng Sean Ye 	 */
51322e4c3acSKeith M Wesolowski 	{ 0x10, 0x02, 0x02, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_10_REV_B, "B",
51422e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
51564452efdSKit Chow 
51664452efdSKit Chow 	/*
51764452efdSKit Chow 	 * Rev C has models 4-6 (depending on L3 cache configuration)
51879321794SJens Elkner 	 * Give all of models 4-6 stepping range 0-2 to rev C2.
51979321794SJens Elkner 	 */
52022e4c3acSKeith M Wesolowski 	{ 0x10, 0x4, 0x6, 0x0, 0x2, X86_CHIPREV_AMD_LEGACY_10_REV_C2, "C2",
52122e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
52279321794SJens Elkner 
52379321794SJens Elkner 	/*
52479321794SJens Elkner 	 * Rev C has models 4-6 (depending on L3 cache configuration)
52579321794SJens Elkner 	 * Give all of models 4-6 stepping range >= 3 to rev C3.
52679321794SJens Elkner 	 */
52722e4c3acSKeith M Wesolowski 	{ 0x10, 0x4, 0x6, 0x3, 0xf, X86_CHIPREV_AMD_LEGACY_10_REV_C3, "C3",
52822e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
52979321794SJens Elkner 
53079321794SJens Elkner 	/*
53179321794SJens Elkner 	 * Rev D has models 8 and 9
53279321794SJens Elkner 	 * Give all of model 8 and 9 stepping 0 to rev D0.
53364452efdSKit Chow 	 */
53422e4c3acSKeith M Wesolowski 	{ 0x10, 0x8, 0x9, 0x0, 0x0, X86_CHIPREV_AMD_LEGACY_10_REV_D0, "D0",
53522e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
53689e921d5SKuriakose Kuruvilla 
53789e921d5SKuriakose Kuruvilla 	/*
53889e921d5SKuriakose Kuruvilla 	 * Rev D has models 8 and 9
53979321794SJens Elkner 	 * Give all of model 8 and 9 stepping range >= 1 to rev D1.
54079321794SJens Elkner 	 */
54122e4c3acSKeith M Wesolowski 	{ 0x10, 0x8, 0x9, 0x1, 0xf, X86_CHIPREV_AMD_LEGACY_10_REV_D1, "D1",
54222e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
54379321794SJens Elkner 
54479321794SJens Elkner 	/*
54579321794SJens Elkner 	 * Rev E has models A and stepping 0
54679321794SJens Elkner 	 * Give all of model A stepping range to rev E.
54789e921d5SKuriakose Kuruvilla 	 */
54822e4c3acSKeith M Wesolowski 	{ 0x10, 0xA, 0xA, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_10_REV_E, "E",
54922e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
55022e4c3acSKeith M Wesolowski 
55122e4c3acSKeith M Wesolowski 	{ 0x10, 0x0, 0xff, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_10_UNKNOWN, "??",
55222e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_2 },
55389e921d5SKuriakose Kuruvilla 
55489e921d5SKuriakose Kuruvilla 	/*
55589e921d5SKuriakose Kuruvilla 	 * =============== AuthenticAMD Family 0x11 ===============
55689e921d5SKuriakose Kuruvilla 	 */
55722e4c3acSKeith M Wesolowski 	{ 0x11, 0x03, 0x03, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_11_REV_B, "B",
55822e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_3 },
55922e4c3acSKeith M Wesolowski 	{ 0x11, 0x00, 0xff, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_11_UNKNOWN, "??",
56022e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_3 },
56179321794SJens Elkner 
56279321794SJens Elkner 	/*
56379321794SJens Elkner 	 * =============== AuthenticAMD Family 0x12 ===============
56479321794SJens Elkner 	 */
56522e4c3acSKeith M Wesolowski 	{ 0x12, 0x01, 0x01, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_12_REV_B, "B",
56622e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_4 },
56722e4c3acSKeith M Wesolowski 	{ 0x12, 0x00, 0x00, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_12_UNKNOWN, "??",
56822e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_4 },
56979321794SJens Elkner 
57079321794SJens Elkner 	/*
57179321794SJens Elkner 	 * =============== AuthenticAMD Family 0x14 ===============
57279321794SJens Elkner 	 */
57322e4c3acSKeith M Wesolowski 	{ 0x14, 0x01, 0x01, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_14_REV_B, "B",
57422e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_5 },
57522e4c3acSKeith M Wesolowski 	{ 0x14, 0x02, 0x02, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_14_REV_C, "C",
57622e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_5 },
57722e4c3acSKeith M Wesolowski 	{ 0x14, 0x00, 0xff, 0x0, 0xf, X86_CHIPREV_AMD_LEGACY_14_UNKNOWN, "??",
57822e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_5 },
57979321794SJens Elkner 
58079321794SJens Elkner 	/*
58179321794SJens Elkner 	 * =============== AuthenticAMD Family 0x15 ===============
58279321794SJens Elkner 	 */
58322e4c3acSKeith M Wesolowski 	{ 0x15, 0x01, 0x01, 0x2, 0x2, X86_CHIPREV_AMD_OROCHI_REV_B2, "OR-B2",
58422e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_6 },
58522e4c3acSKeith M Wesolowski 	{ 0x15, 0x02, 0x02, 0x0, 0x0, X86_CHIPREV_AMD_OROCHI_REV_C0, "OR-C0",
58622e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_6 },
58722e4c3acSKeith M Wesolowski 	{ 0x15, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_OROCHI_UNKNOWN, "OR-??",
58822e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_6 },
58922e4c3acSKeith M Wesolowski 
59022e4c3acSKeith M Wesolowski 	{ 0x15, 0x10, 0x10, 0x1, 0x1, X86_CHIPREV_AMD_TRINITY_REV_A1, "TN-A1",
59122e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_7 },
59222e4c3acSKeith M Wesolowski 	{ 0x15, 0x10, 0x1f, 0x0, 0xf, X86_CHIPREV_AMD_TRINITY_UNKNOWN, "TN-??",
59322e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_7 },
59422e4c3acSKeith M Wesolowski 
59522e4c3acSKeith M Wesolowski 	{ 0x15, 0x30, 0x30, 0x1, 0x1, X86_CHIPREV_AMD_KAVERI_REV_A1, "KV-A1",
59622e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_8 },
59722e4c3acSKeith M Wesolowski 	{ 0x15, 0x30, 0x3f, 0x0, 0xf, X86_CHIPREV_AMD_KAVERI_UNKNOWN, "KV-??",
59822e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_8 },
59922e4c3acSKeith M Wesolowski 
60022e4c3acSKeith M Wesolowski 	/*
60122e4c3acSKeith M Wesolowski 	 * The Carrizo rev guide mentions A0 as having an ID of "00600F00h" but
60222e4c3acSKeith M Wesolowski 	 * this appears to be a typo as elsewhere it's given as "00660F00h".  We
60322e4c3acSKeith M Wesolowski 	 * assume the latter is correct.
60422e4c3acSKeith M Wesolowski 	 */
60522e4c3acSKeith M Wesolowski 	{ 0x15, 0x60, 0x60, 0x0, 0x0, X86_CHIPREV_AMD_CARRIZO_REV_A0, "CZ-A0",
60622e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_9 },
60722e4c3acSKeith M Wesolowski 	{ 0x15, 0x60, 0x60, 0x1, 0x1, X86_CHIPREV_AMD_CARRIZO_REV_A1, "CZ-A1",
60822e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_9 },
6092ce06f32SRobert Mustacchi 	/*
61022e4c3acSKeith M Wesolowski 	 * CZ-DDR4 and BR-A1 are indistinguishable via cpuid; the rev guide
61122e4c3acSKeith M Wesolowski 	 * indicates that they should be distinguished by the contents of the
61222e4c3acSKeith M Wesolowski 	 * OSVW MSR, but this register is just a software scratch space which
61322e4c3acSKeith M Wesolowski 	 * means the actual method of distinguishing the two is not documented
61422e4c3acSKeith M Wesolowski 	 * and on PCs will be done by a BIOS.  In the extremely unlikely event
61522e4c3acSKeith M Wesolowski 	 * it becomes necessary to distinguish these, an OSVW-driven fixup can
61622e4c3acSKeith M Wesolowski 	 * be added.
6172ce06f32SRobert Mustacchi 	 */
61822e4c3acSKeith M Wesolowski 	{ 0x15, 0x65, 0x65, 0x1, 0x1, X86_CHIPREV_AMD_CARRIZO_REV_DDR4,
61922e4c3acSKeith M Wesolowski 	    "CZ-DDR4", X86_UARCHREV_AMD_LEGACY, A_SKTS_9 },
62022e4c3acSKeith M Wesolowski 	{ 0x15, 0x60, 0x6f, 0x0, 0xf, X86_CHIPREV_AMD_CARRIZO_UNKNOWN, "CZ-??",
62122e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_9 },
62222e4c3acSKeith M Wesolowski 
62322e4c3acSKeith M Wesolowski 	{ 0x15, 0x70, 0x70, 0x0, 0x0, X86_CHIPREV_AMD_STONEY_RIDGE_REV_A0,
62422e4c3acSKeith M Wesolowski 	    "ST-A0", X86_UARCHREV_AMD_LEGACY, A_SKTS_10 },
62522e4c3acSKeith M Wesolowski 	{ 0x15, 0x70, 0x7f, 0x0, 0xf, X86_CHIPREV_AMD_STONEY_RIDGE_UNKNOWN,
62622e4c3acSKeith M Wesolowski 	    "ST-??", X86_UARCHREV_AMD_LEGACY, A_SKTS_10 },
6272ce06f32SRobert Mustacchi 
6282ce06f32SRobert Mustacchi 	/*
6292ce06f32SRobert Mustacchi 	 * =============== AuthenticAMD Family 0x16 ===============
6302ce06f32SRobert Mustacchi 	 */
63122e4c3acSKeith M Wesolowski 	{ 0x16, 0x00, 0x00, 0x1, 0x1, X86_CHIPREV_AMD_KABINI_A1, "KB-A1",
63222e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_11 },
63322e4c3acSKeith M Wesolowski 	{ 0x16, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_KABINI_UNKNOWN, "KB-??",
63422e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_11 },
63522e4c3acSKeith M Wesolowski 
63622e4c3acSKeith M Wesolowski 	{ 0x16, 0x30, 0x30, 0x1, 0x1, X86_CHIPREV_AMD_MULLINS_A1, "ML-A1",
63722e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_12 },
63822e4c3acSKeith M Wesolowski 	{ 0x16, 0x30, 0x3f, 0x0, 0xf, X86_CHIPREV_AMD_MULLINS_UNKNOWN, "ML-??",
63922e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_LEGACY, A_SKTS_12 },
6402ce06f32SRobert Mustacchi 
6412ce06f32SRobert Mustacchi 	/*
6422ce06f32SRobert Mustacchi 	 * =============== AuthenticAMD Family 0x17 ===============
6432ce06f32SRobert Mustacchi 	 */
64422e4c3acSKeith M Wesolowski 	/* Naples == Zeppelin == ZP */
64522e4c3acSKeith M Wesolowski 	{ 0x17, 0x00, 0x00, 0x0, 0x0, X86_CHIPREV_AMD_NAPLES_A0, "ZP-A0",
646f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN1, A_SKTS_NAPLES },
64722e4c3acSKeith M Wesolowski 	{ 0x17, 0x01, 0x01, 0x1, 0x1, X86_CHIPREV_AMD_NAPLES_B1, "ZP-B1",
648f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN1, A_SKTS_NAPLES },
64922e4c3acSKeith M Wesolowski 	{ 0x17, 0x01, 0x01, 0x2, 0x2, X86_CHIPREV_AMD_NAPLES_B2, "ZP-B2",
650f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN1, A_SKTS_NAPLES },
65122e4c3acSKeith M Wesolowski 	{ 0x17, 0x00, 0x07, 0x0, 0xf, X86_CHIPREV_AMD_NAPLES_UNKNOWN, "ZP-??",
652f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN1, A_SKTS_NAPLES },
65322e4c3acSKeith M Wesolowski 	{ 0x17, 0x08, 0x08, 0x2, 0x2, X86_CHIPREV_AMD_PINNACLE_RIDGE_B2,
654f95a9494SRobert Mustacchi 	    "PiR-B2", X86_UARCHREV_AMD_ZENPLUS, A_SKTS_NAPLES },
65522e4c3acSKeith M Wesolowski 	{ 0x17, 0x08, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_PINNACLE_RIDGE_UNKNOWN,
656f95a9494SRobert Mustacchi 	    "PiR-??", X86_UARCHREV_AMD_ZENPLUS, A_SKTS_NAPLES },
65722e4c3acSKeith M Wesolowski 
65822e4c3acSKeith M Wesolowski 	{ 0x17, 0x11, 0x11, 0x0, 0x0, X86_CHIPREV_AMD_RAVEN_RIDGE_B0,
659f95a9494SRobert Mustacchi 	    "RV-B0", X86_UARCHREV_AMD_ZEN1, A_SKTS_RAVEN },
66022e4c3acSKeith M Wesolowski 	{ 0x17, 0x11, 0x11, 0x1, 0x1, X86_CHIPREV_AMD_RAVEN_RIDGE_B1,
661f95a9494SRobert Mustacchi 	    "RV-B1", X86_UARCHREV_AMD_ZEN1, A_SKTS_RAVEN },
66222e4c3acSKeith M Wesolowski 	{ 0x17, 0x10, 0x17, 0x0, 0xf, X86_CHIPREV_AMD_RAVEN_RIDGE_UNKNOWN,
663f95a9494SRobert Mustacchi 	    "RV-??", X86_UARCHREV_AMD_ZEN1, A_SKTS_RAVEN },
66422e4c3acSKeith M Wesolowski 	{ 0x17, 0x18, 0x18, 0x1, 0x1, X86_CHIPREV_AMD_PICASSO_B1, "PCO-B1",
665f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZENPLUS, A_SKTS_RAVEN },
66622e4c3acSKeith M Wesolowski 	{ 0x17, 0x18, 0x1f, 0x0, 0xf, X86_CHIPREV_AMD_PICASSO_UNKNOWN, "PCO-??",
667f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZENPLUS, A_SKTS_RAVEN },
66822e4c3acSKeith M Wesolowski 
66922e4c3acSKeith M Wesolowski 	{ 0x17, 0x20, 0x20, 0x1, 0x1, X86_CHIPREV_AMD_DALI_A1, "RV2X-A1",
670f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN1, A_SKTS_RAVEN },
67122e4c3acSKeith M Wesolowski 	{ 0x17, 0x20, 0x2f, 0x0, 0xf, X86_CHIPREV_AMD_DALI_UNKNOWN, "RV2X-??",
672f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN1, A_SKTS_RAVEN },
67322e4c3acSKeith M Wesolowski 
67422e4c3acSKeith M Wesolowski 	/* Rome == Starship == SSP */
67522e4c3acSKeith M Wesolowski 	{ 0x17, 0x30, 0x30, 0x0, 0x0, X86_CHIPREV_AMD_ROME_A0, "SSP-A0",
676f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN2_A0, A_SKTS_ROME },
67722e4c3acSKeith M Wesolowski 	{ 0x17, 0x31, 0x31, 0x0, 0x0, X86_CHIPREV_AMD_ROME_B0, "SSP-B0",
678f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN2_B0, A_SKTS_ROME },
67922e4c3acSKeith M Wesolowski 	{ 0x17, 0x30, 0x3f, 0x0, 0xf, X86_CHIPREV_AMD_ROME_UNKNOWN, "SSP-??",
680f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_ROME },
68122e4c3acSKeith M Wesolowski 
68222e4c3acSKeith M Wesolowski 	{ 0x17, 0x60, 0x60, 0x1, 0x1, X86_CHIPREV_AMD_RENOIR_A1, "RN-A1",
683f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN2_B0, A_SKTS_RENOIR },
68422e4c3acSKeith M Wesolowski 	{ 0x17, 0x60, 0x67, 0x0, 0xf, X86_CHIPREV_AMD_RENOIR_UNKNOWN, "RN-??",
685f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_RENOIR },
68622e4c3acSKeith M Wesolowski 	{ 0x17, 0x68, 0x68, 0x1, 0x1, X86_CHIPREV_AMD_RENOIR_LCN_A1, "LCN-A1",
687f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN2_B0, A_SKTS_RENOIR },
68822e4c3acSKeith M Wesolowski 	{ 0x17, 0x68, 0x6f, 0x0, 0xf, X86_CHIPREV_AMD_RENOIR_UNKNOWN, "LCN-??",
689f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_RENOIR },
69022e4c3acSKeith M Wesolowski 
69122e4c3acSKeith M Wesolowski 	{ 0x17, 0x71, 0x71, 0x0, 0x0, X86_CHIPREV_AMD_MATISSE_B0, "MTS-B0",
692f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN2_B0, A_SKTS_MATISSE },
69322e4c3acSKeith M Wesolowski 	{ 0x17, 0x70, 0x7f, 0x0, 0xf, X86_CHIPREV_AMD_MATISSE_UNKNOWN, "MTS-??",
694f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_MATISSE },
69522e4c3acSKeith M Wesolowski 
69622e4c3acSKeith M Wesolowski 	{ 0x17, 0x90, 0x97, 0x0, 0xf, X86_CHIPREV_AMD_VAN_GOGH_UNKNOWN, "??",
697f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_VANGOGH },
69822e4c3acSKeith M Wesolowski 	{ 0x17, 0x98, 0x9f, 0x0, 0xf, X86_CHIPREV_AMD_VAN_GOGH_UNKNOWN, "??",
69922e4c3acSKeith M Wesolowski 	    X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_UNKNOWN },
70022e4c3acSKeith M Wesolowski 
70122e4c3acSKeith M Wesolowski 	{ 0x17, 0xa0, 0xaf, 0x0, 0xf, X86_CHIPREV_AMD_MENDOCINO_UNKNOWN, "??",
702f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN2_UNKNOWN, A_SKTS_MENDOCINO },
7039b0429a1SPu Wen 
7049b0429a1SPu Wen 	/*
7059b0429a1SPu Wen 	 * =============== HygonGenuine Family 0x18 ===============
7069b0429a1SPu Wen 	 */
70722e4c3acSKeith M Wesolowski 	{ 0x18, 0x00, 0x00, 0x1, 0x1, X86_CHIPREV_HYGON_DHYANA_A1, "DN_A1",
708f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN1, A_SKTS_DHYANA },
70922e4c3acSKeith M Wesolowski 	{ 0x18, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_HYGON_DHYANA_UNKNOWN, "DN_??",
710f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN1, A_SKTS_DHYANA },
711bdc24928SRobert Mustacchi 
712bdc24928SRobert Mustacchi 	/*
713bdc24928SRobert Mustacchi 	 * =============== AuthenticAMD Family 0x19 ===============
714bdc24928SRobert Mustacchi 	 */
71522e4c3acSKeith M Wesolowski 	/* Milan == Genesis == GN */
71622e4c3acSKeith M Wesolowski 	{ 0x19, 0x00, 0x00, 0x0, 0x0, X86_CHIPREV_AMD_MILAN_A0, "GN-A0",
717f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_A0, A_SKTS_MILAN },
71822e4c3acSKeith M Wesolowski 	{ 0x19, 0x01, 0x01, 0x0, 0x0, X86_CHIPREV_AMD_MILAN_B0, "GN-B0",
719f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_MILAN },
72022e4c3acSKeith M Wesolowski 	{ 0x19, 0x01, 0x01, 0x1, 0x1, X86_CHIPREV_AMD_MILAN_B1, "GN-B1",
721f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_B1, A_SKTS_MILAN },
72222e4c3acSKeith M Wesolowski 	/* Marketed as Milan-X but still GN */
72322e4c3acSKeith M Wesolowski 	{ 0x19, 0x01, 0x01, 0x2, 0x2, X86_CHIPREV_AMD_MILAN_B2, "GN-B2",
724f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_B2, A_SKTS_MILAN },
72522e4c3acSKeith M Wesolowski 	{ 0x19, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_MILAN_UNKNOWN, "GN-??",
726f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_UNKNOWN, A_SKTS_MILAN },
72722e4c3acSKeith M Wesolowski 
72822e4c3acSKeith M Wesolowski 	/* Genoa == Stones == RS */
72922e4c3acSKeith M Wesolowski 	{ 0x19, 0x10, 0x10, 0x0, 0x0, X86_CHIPREV_AMD_GENOA_A0, "RS-A0",
730f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_A0, A_SKTS_GENOA },
731f32e173eSLuqman Aden 	/* RS-A0 & RS-A1 both map to Zen 4 uarch A0 */
732e6f89c3aSRobert Mustacchi 	{ 0x19, 0x10, 0x10, 0x1, 0x1, X86_CHIPREV_AMD_GENOA_A1, "RS-A1",
733f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_A0, A_SKTS_GENOA },
734e6f89c3aSRobert Mustacchi 	{ 0x19, 0x11, 0x11, 0x0, 0x0, X86_CHIPREV_AMD_GENOA_B0, "RS-B0",
735f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_B0, A_SKTS_GENOA },
736e6f89c3aSRobert Mustacchi 	{ 0x19, 0x11, 0x11, 0x1, 0x1, X86_CHIPREV_AMD_GENOA_B1, "RS-B1",
737f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_B1, A_SKTS_GENOA },
73822e4c3acSKeith M Wesolowski 	{ 0x19, 0x10, 0x1f, 0x0, 0xf, X86_CHIPREV_AMD_GENOA_UNKNOWN, "RS-??",
739f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_UNKNOWN, A_SKTS_GENOA },
74022e4c3acSKeith M Wesolowski 
74122e4c3acSKeith M Wesolowski 	{ 0x19, 0x20, 0x20, 0x0, 0x0, X86_CHIPREV_AMD_VERMEER_A0, "VMR-A0",
742f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_A0, A_SKTS_VERMEER },
74322e4c3acSKeith M Wesolowski 	{ 0x19, 0x21, 0x21, 0x0, 0x0, X86_CHIPREV_AMD_VERMEER_B0, "VMR-B0",
744f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_VERMEER },
74522e4c3acSKeith M Wesolowski 	{ 0x19, 0x21, 0x21, 0x2, 0x2, X86_CHIPREV_AMD_VERMEER_B2, "VMR-B2",
746f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_B2, A_SKTS_VERMEER },
74722e4c3acSKeith M Wesolowski 	{ 0x19, 0x20, 0x2f, 0x0, 0xf, X86_CHIPREV_AMD_VERMEER_UNKNOWN, "VMR-??",
748f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_UNKNOWN, A_SKTS_VERMEER },
74922e4c3acSKeith M Wesolowski 
75022e4c3acSKeith M Wesolowski 	/* Rev guide is missing AM5 information, including A0 and B0 */
75122e4c3acSKeith M Wesolowski 	{ 0x19, 0x40, 0x40, 0x0, 0x0, X86_CHIPREV_AMD_REMBRANDT_A0, "RMB-A0",
752f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_REMBRANDT },
75322e4c3acSKeith M Wesolowski 	{ 0x19, 0x44, 0x44, 0x0, 0x0, X86_CHIPREV_AMD_REMBRANDT_B0, "RMB-B0",
754f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_REMBRANDT },
75522e4c3acSKeith M Wesolowski 	{ 0x19, 0x44, 0x44, 0x1, 0x1, X86_CHIPREV_AMD_REMBRANDT_B1, "RMB-B1",
756f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_REMBRANDT },
75722e4c3acSKeith M Wesolowski 	{ 0x19, 0x40, 0x4f, 0x0, 0xf, X86_CHIPREV_AMD_REMBRANDT_UNKNOWN,
758f95a9494SRobert Mustacchi 	    "RMB-??", X86_UARCHREV_AMD_ZEN3_UNKNOWN, A_SKTS_REMBRANDT },
75922e4c3acSKeith M Wesolowski 
760e6f89c3aSRobert Mustacchi 	/* Cezanne */
76122e4c3acSKeith M Wesolowski 	{ 0x19, 0x50, 0x50, 0x0, 0x0, X86_CHIPREV_AMD_CEZANNE_A0, "CZN-A0",
762f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_B0, A_SKTS_CEZANNE },
76322e4c3acSKeith M Wesolowski 	{ 0x19, 0x50, 0x5f, 0x0, 0xf, X86_CHIPREV_AMD_CEZANNE_UNKNOWN, "CZN-??",
764f95a9494SRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN3_UNKNOWN, A_SKTS_CEZANNE },
76522e4c3acSKeith M Wesolowski 
766e6f89c3aSRobert Mustacchi 	/* Raphael */
767e6f89c3aSRobert Mustacchi 	{ 0x19, 0x61, 0x61, 0x2, 0x2, X86_CHIPREV_AMD_RAPHAEL_B2, "RPL-B2",
768f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_B2, A_SKTS_RAPHAEL },
769e6f89c3aSRobert Mustacchi 	{ 0x19, 0x60, 0x6f, 0x0, 0xf, X86_CHIPREV_AMD_RAPHAEL_UNKNOWN, "RPL-??",
770f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_UNKNOWN, A_SKTS_RAPHAEL },
771e6f89c3aSRobert Mustacchi 
772e6f89c3aSRobert Mustacchi 	/* Phoenix */
773e6f89c3aSRobert Mustacchi 	{ 0x19, 0x74, 0x74, 0x1, 0x1, X86_CHIPREV_AMD_PHOENIX_A1, "PHX-A1",
774f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_A1, A_SKTS_PHOENIX },
775e6f89c3aSRobert Mustacchi 	{ 0x19, 0x70, 0x7f, 0x0, 0xf, X86_CHIPREV_AMD_PHOENIX_UNKNOWN, "PHX-??",
776f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_UNKNOWN, A_SKTS_PHOENIX },
777f95a9494SRobert Mustacchi 
778f95a9494SRobert Mustacchi 	/* Bergamo / Siena */
779f95a9494SRobert Mustacchi 	{ 0x19, 0xa0, 0xaf, 0x0, 0x0, X86_CHIPREV_AMD_BERGAMO_A0, "RSDN-A0",
780f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_A0, A_SKTS_BERGAMO },
781f95a9494SRobert Mustacchi 	{ 0x19, 0xa0, 0xaf, 0x1, 0x1, X86_CHIPREV_AMD_BERGAMO_A1, "RSDN-A1",
782f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_A1, A_SKTS_BERGAMO },
783f95a9494SRobert Mustacchi 	{ 0x19, 0xa0, 0xaf, 0x2, 0x2, X86_CHIPREV_AMD_BERGAMO_A2, "RSDN-A2",
784f32e173eSLuqman Aden 	    X86_UARCHREV_AMD_ZEN4_A2, A_SKTS_BERGAMO },
785e6f89c3aSRobert Mustacchi 	{ 0x19, 0xa0, 0xaf, 0x0, 0xf, X86_CHIPREV_AMD_BERGAMO_UNKNOWN, "???",
786*019df03dSRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN4_UNKNOWN, A_SKTS_BERGAMO },
787*019df03dSRobert Mustacchi 
788*019df03dSRobert Mustacchi 	/* Turin */
789*019df03dSRobert Mustacchi 	{ 0x1a, 0x00, 0x0f, 0x0, 0x0, X86_CHIPREV_AMD_TURIN_UNKNOWN, "BRH-A0",
790*019df03dSRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN5_UNKNOWN, A_SKTS_TURIN},
791*019df03dSRobert Mustacchi 	{ 0x1a, 0x00, 0x0f, 0x0, 0xf, X86_CHIPREV_AMD_TURIN_UNKNOWN, "BRH-???",
792*019df03dSRobert Mustacchi 	    X86_UARCHREV_AMD_ZEN5_UNKNOWN, A_SKTS_TURIN},
793*019df03dSRobert Mustacchi 	{ 0x1a, 0x10, 0x1f, 0x0, 0xf, X86_CHIPREV_AMD_DENSE_TURIN_UNKNOWN,
794*019df03dSRobert Mustacchi 	    "BRHD-???", X86_UARCHREV_AMD_ZEN5_UNKNOWN, A_SKTS_TURIN}
795*019df03dSRobert Mustacchi 
796e4b86885SCheng Sean Ye };
797e4b86885SCheng Sean Ye 
798a41862fcSRobert Mustacchi /*
799a41862fcSRobert Mustacchi  * AMD keeps the socket type in CPUID Fn8000_0001_EBX, bits 31:28.
800a41862fcSRobert Mustacchi  */
801a41862fcSRobert Mustacchi static uint32_t
synth_amd_skt_cpuid(uint_t family,uint_t sktid)802a41862fcSRobert Mustacchi synth_amd_skt_cpuid(uint_t family, uint_t sktid)
803a41862fcSRobert Mustacchi {
804a41862fcSRobert Mustacchi 	struct cpuid_regs cp;
805a41862fcSRobert Mustacchi 	uint_t idx;
806a41862fcSRobert Mustacchi 
807a41862fcSRobert Mustacchi 	cp.cp_eax = 0x80000001;
808a41862fcSRobert Mustacchi 	(void) __cpuid_insn(&cp);
809a41862fcSRobert Mustacchi 
810a41862fcSRobert Mustacchi 	/* PkgType bits */
811a41862fcSRobert Mustacchi 	idx = BITX(cp.cp_ebx, 31, 28);
812a41862fcSRobert Mustacchi 
813a41862fcSRobert Mustacchi 	if (family == 0x10) {
814a41862fcSRobert Mustacchi 		uint32_t val;
815a41862fcSRobert Mustacchi 
816a41862fcSRobert Mustacchi 		val = pci_getl_func(0, 24, 2, 0x94);
817a41862fcSRobert Mustacchi 		if (BITX(val, 8, 8)) {
818a41862fcSRobert Mustacchi 			if (amd_skts[sktid][idx] == X86_SOCKET_AM2R2) {
819a41862fcSRobert Mustacchi 				return (X86_SOCKET_AM3);
820a41862fcSRobert Mustacchi 			} else if (amd_skts[sktid][idx] == X86_SOCKET_S1g3) {
821a41862fcSRobert Mustacchi 				return (X86_SOCKET_S1g4);
822a41862fcSRobert Mustacchi 			}
823a41862fcSRobert Mustacchi 		}
824a41862fcSRobert Mustacchi 	}
825a41862fcSRobert Mustacchi 
826a41862fcSRobert Mustacchi 	return (amd_skts[sktid][idx]);
827a41862fcSRobert Mustacchi }
828a41862fcSRobert Mustacchi 
829e4b86885SCheng Sean Ye 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)830e4b86885SCheng Sean Ye synth_amd_info(uint_t family, uint_t model, uint_t step,
83122e4c3acSKeith M Wesolowski     uint32_t *skt_p, x86_chiprev_t *chiprev_p, const char **chiprevstr_p,
83222e4c3acSKeith M Wesolowski     x86_uarchrev_t *uarchrev_p)
833e4b86885SCheng Sean Ye {
834e4b86885SCheng Sean Ye 	const struct amd_rev_mapent *rmp;
835e4b86885SCheng Sean Ye 	int found = 0;
836e4b86885SCheng Sean Ye 	int i;
837e4b86885SCheng Sean Ye 
83889e921d5SKuriakose Kuruvilla 	if (family < 0xf)
839e4b86885SCheng Sean Ye 		return;
840e4b86885SCheng Sean Ye 
841a41862fcSRobert Mustacchi 	for (i = 0, rmp = amd_revmap; i < ARRAY_SIZE(amd_revmap); i++, rmp++) {
842e4b86885SCheng Sean Ye 		if (family == rmp->rm_family &&
843e4b86885SCheng Sean Ye 		    model >= rmp->rm_modello && model <= rmp->rm_modelhi &&
844e4b86885SCheng Sean Ye 		    step >= rmp->rm_steplo && step <= rmp->rm_stephi) {
845e4b86885SCheng Sean Ye 			found = 1;
846e4b86885SCheng Sean Ye 			break;
847e4b86885SCheng Sean Ye 		}
848e4b86885SCheng Sean Ye 	}
849e4b86885SCheng Sean Ye 
85022e4c3acSKeith M Wesolowski 	if (found) {
85122e4c3acSKeith M Wesolowski 		if (chiprev_p != NULL)
85222e4c3acSKeith M Wesolowski 			*chiprev_p = rmp->rm_chiprev;
85322e4c3acSKeith M Wesolowski 		if (chiprevstr_p != NULL)
85422e4c3acSKeith M Wesolowski 			*chiprevstr_p = rmp->rm_chiprevstr;
85522e4c3acSKeith M Wesolowski 		if (uarchrev_p != NULL)
85622e4c3acSKeith M Wesolowski 			*uarchrev_p = rmp->rm_uarchrev;
857a41862fcSRobert Mustacchi 	}
85889e921d5SKuriakose Kuruvilla 
85989e921d5SKuriakose Kuruvilla 	if (skt_p != NULL) {
86089e921d5SKuriakose Kuruvilla 		int platform;
86189e921d5SKuriakose Kuruvilla 
86289e921d5SKuriakose Kuruvilla #ifdef __xpv
86389e921d5SKuriakose Kuruvilla 		/* PV guest */
86489e921d5SKuriakose Kuruvilla 		if (!is_controldom()) {
86589e921d5SKuriakose Kuruvilla 			*skt_p = X86_SOCKET_UNKNOWN;
86689e921d5SKuriakose Kuruvilla 			return;
86789e921d5SKuriakose Kuruvilla 		}
86889e921d5SKuriakose Kuruvilla #endif
86989e921d5SKuriakose Kuruvilla 		platform = get_hwenv();
87089e921d5SKuriakose Kuruvilla 
87179ec9da8SYuri Pankov 		if ((platform & HW_VIRTUAL) != 0) {
87289e921d5SKuriakose Kuruvilla 			*skt_p = X86_SOCKET_UNKNOWN;
87322e4c3acSKeith M Wesolowski 			return;
87422e4c3acSKeith M Wesolowski 		}
87522e4c3acSKeith M Wesolowski 
87622e4c3acSKeith M Wesolowski 		if (!found)
87722e4c3acSKeith M Wesolowski 			return;
87822e4c3acSKeith M Wesolowski 
87922e4c3acSKeith M Wesolowski 		if (family == 0xf) {
880e4b86885SCheng Sean Ye 			*skt_p = amd_skts[rmp->rm_sktidx][model & 0x3];
88189e921d5SKuriakose Kuruvilla 		} else {
882a41862fcSRobert Mustacchi 			*skt_p = synth_amd_skt_cpuid(family, rmp->rm_sktidx);
88389e921d5SKuriakose Kuruvilla 		}
884e4b86885SCheng Sean Ye 	}
885e4b86885SCheng Sean Ye }
886e4b86885SCheng Sean Ye 
887e4b86885SCheng Sean Ye uint32_t
_cpuid_skt(uint_t vendor,uint_t family,uint_t model,uint_t step)888e4b86885SCheng Sean Ye _cpuid_skt(uint_t vendor, uint_t family, uint_t model, uint_t step)
889e4b86885SCheng Sean Ye {
890e4b86885SCheng Sean Ye 	uint32_t skt = X86_SOCKET_UNKNOWN;
891e4b86885SCheng Sean Ye 
892e4b86885SCheng Sean Ye 	switch (vendor) {
893e4b86885SCheng Sean Ye 	case X86_VENDOR_AMD:
8949b0429a1SPu Wen 	case X86_VENDOR_HYGON:
89522e4c3acSKeith M Wesolowski 		synth_amd_info(family, model, step, &skt, NULL, NULL, NULL);
896e4b86885SCheng Sean Ye 		break;
897e4b86885SCheng Sean Ye 
898e4b86885SCheng Sean Ye 	default:
899e4b86885SCheng Sean Ye 		break;
900e4b86885SCheng Sean Ye 
901e4b86885SCheng Sean Ye 	}
902e4b86885SCheng Sean Ye 
903e4b86885SCheng Sean Ye 	return (skt);
904e4b86885SCheng Sean Ye }
905e4b86885SCheng Sean Ye 
90689e921d5SKuriakose Kuruvilla const char *
_cpuid_sktstr(uint_t vendor,uint_t family,uint_t model,uint_t step)90789e921d5SKuriakose Kuruvilla _cpuid_sktstr(uint_t vendor, uint_t family, uint_t model, uint_t step)
90889e921d5SKuriakose Kuruvilla {
90989e921d5SKuriakose Kuruvilla 	const char *sktstr = "Unknown";
91089e921d5SKuriakose Kuruvilla 	struct amd_sktmap_s *sktmapp;
91189e921d5SKuriakose Kuruvilla 	uint32_t skt = X86_SOCKET_UNKNOWN;
91289e921d5SKuriakose Kuruvilla 
91389e921d5SKuriakose Kuruvilla 	switch (vendor) {
91489e921d5SKuriakose Kuruvilla 	case X86_VENDOR_AMD:
9159b0429a1SPu Wen 	case X86_VENDOR_HYGON:
91622e4c3acSKeith M Wesolowski 		synth_amd_info(family, model, step, &skt, NULL, NULL, NULL);
91789e921d5SKuriakose Kuruvilla 
918a41862fcSRobert Mustacchi 		sktmapp = amd_sktmap_strs;
91989e921d5SKuriakose Kuruvilla 		while (sktmapp->skt_code != X86_SOCKET_UNKNOWN) {
92089e921d5SKuriakose Kuruvilla 			if (sktmapp->skt_code == skt)
92189e921d5SKuriakose Kuruvilla 				break;
92289e921d5SKuriakose Kuruvilla 			sktmapp++;
92389e921d5SKuriakose Kuruvilla 		}
92489e921d5SKuriakose Kuruvilla 		sktstr = sktmapp->sktstr;
92589e921d5SKuriakose Kuruvilla 		break;
92689e921d5SKuriakose Kuruvilla 
92789e921d5SKuriakose Kuruvilla 	default:
92889e921d5SKuriakose Kuruvilla 		break;
92989e921d5SKuriakose Kuruvilla 
93089e921d5SKuriakose Kuruvilla 	}
93189e921d5SKuriakose Kuruvilla 
93289e921d5SKuriakose Kuruvilla 	return (sktstr);
93389e921d5SKuriakose Kuruvilla }
93489e921d5SKuriakose Kuruvilla 
93522e4c3acSKeith M Wesolowski x86_chiprev_t
_cpuid_chiprev(uint_t vendor,uint_t family,uint_t model,uint_t step)936e4b86885SCheng Sean Ye _cpuid_chiprev(uint_t vendor, uint_t family, uint_t model, uint_t step)
937e4b86885SCheng Sean Ye {
93822e4c3acSKeith M Wesolowski 	x86_chiprev_t chiprev = X86_CHIPREV_UNKNOWN;
939e4b86885SCheng Sean Ye 
940e4b86885SCheng Sean Ye 	switch (vendor) {
941e4b86885SCheng Sean Ye 	case X86_VENDOR_AMD:
9429b0429a1SPu Wen 	case X86_VENDOR_HYGON:
94322e4c3acSKeith M Wesolowski 		synth_amd_info(family, model, step, NULL, &chiprev, NULL, NULL);
944e4b86885SCheng Sean Ye 		break;
945e4b86885SCheng Sean Ye 
946e4b86885SCheng Sean Ye 	default:
947e4b86885SCheng Sean Ye 		break;
948e4b86885SCheng Sean Ye 
949e4b86885SCheng Sean Ye 	}
950e4b86885SCheng Sean Ye 
951e4b86885SCheng Sean Ye 	return (chiprev);
952e4b86885SCheng Sean Ye }
953e4b86885SCheng Sean Ye 
95422e4c3acSKeith M Wesolowski x86_uarchrev_t
_cpuid_uarchrev(uint_t vendor,uint_t family,uint_t model,uint_t step)95522e4c3acSKeith M Wesolowski _cpuid_uarchrev(uint_t vendor, uint_t family, uint_t model, uint_t step)
95622e4c3acSKeith M Wesolowski {
95722e4c3acSKeith M Wesolowski 	x86_uarchrev_t uarchrev = X86_UARCHREV_UNKNOWN;
95822e4c3acSKeith M Wesolowski 
95922e4c3acSKeith M Wesolowski 	switch (vendor) {
96022e4c3acSKeith M Wesolowski 	case X86_VENDOR_AMD:
96122e4c3acSKeith M Wesolowski 	case X86_VENDOR_HYGON:
96222e4c3acSKeith M Wesolowski 		synth_amd_info(family, model, step, NULL, NULL, NULL,
96322e4c3acSKeith M Wesolowski 		    &uarchrev);
96422e4c3acSKeith M Wesolowski 		break;
96522e4c3acSKeith M Wesolowski 
96622e4c3acSKeith M Wesolowski 	default:
96722e4c3acSKeith M Wesolowski 		break;
96822e4c3acSKeith M Wesolowski 
96922e4c3acSKeith M Wesolowski 	}
97022e4c3acSKeith M Wesolowski 
97122e4c3acSKeith M Wesolowski 	return (uarchrev);
97222e4c3acSKeith M Wesolowski }
97322e4c3acSKeith M Wesolowski 
974e4b86885SCheng Sean Ye const char *
_cpuid_chiprevstr(uint_t vendor,uint_t family,uint_t model,uint_t step)975e4b86885SCheng Sean Ye _cpuid_chiprevstr(uint_t vendor, uint_t family, uint_t model, uint_t step)
976e4b86885SCheng Sean Ye {
977e4b86885SCheng Sean Ye 	const char *revstr = "Unknown";
978e4b86885SCheng Sean Ye 
979e4b86885SCheng Sean Ye 	switch (vendor) {
980e4b86885SCheng Sean Ye 	case X86_VENDOR_AMD:
9819b0429a1SPu Wen 	case X86_VENDOR_HYGON:
98222e4c3acSKeith M Wesolowski 		synth_amd_info(family, model, step, NULL, NULL, &revstr, NULL);
983e4b86885SCheng Sean Ye 		break;
984e4b86885SCheng Sean Ye 
985e4b86885SCheng Sean Ye 	default:
986e4b86885SCheng Sean Ye 		break;
987e4b86885SCheng Sean Ye 
988e4b86885SCheng Sean Ye 	}
989e4b86885SCheng Sean Ye 
990e4b86885SCheng Sean Ye 	return (revstr);
991e4b86885SCheng Sean Ye 
992e4b86885SCheng Sean Ye }
993e4b86885SCheng Sean Ye 
994e4b86885SCheng Sean Ye /*
995e4b86885SCheng Sean Ye  * Map the vendor string to a type code
996e4b86885SCheng Sean Ye  */
997e4b86885SCheng Sean Ye uint_t
_cpuid_vendorstr_to_vendorcode(char * vendorstr)998e4b86885SCheng Sean Ye _cpuid_vendorstr_to_vendorcode(char *vendorstr)
999e4b86885SCheng Sean Ye {
1000e4b86885SCheng Sean Ye 	if (strcmp(vendorstr, X86_VENDORSTR_Intel) == 0)
1001e4b86885SCheng Sean Ye 		return (X86_VENDOR_Intel);
1002e4b86885SCheng Sean Ye 	else if (strcmp(vendorstr, X86_VENDORSTR_AMD) == 0)
1003e4b86885SCheng Sean Ye 		return (X86_VENDOR_AMD);
10049b0429a1SPu Wen 	else if (strcmp(vendorstr, X86_VENDORSTR_HYGON) == 0)
10059b0429a1SPu Wen 		return (X86_VENDOR_HYGON);
1006e4b86885SCheng Sean Ye 	else if (strcmp(vendorstr, X86_VENDORSTR_TM) == 0)
1007e4b86885SCheng Sean Ye 		return (X86_VENDOR_TM);
1008ab5bb018SKeith M Wesolowski 	else if (strcmp(vendorstr, X86_VENDORSTR_CYRIX) == 0)
1009e4b86885SCheng Sean Ye 		return (X86_VENDOR_Cyrix);
1010e4b86885SCheng Sean Ye 	else if (strcmp(vendorstr, X86_VENDORSTR_UMC) == 0)
1011e4b86885SCheng Sean Ye 		return (X86_VENDOR_UMC);
1012e4b86885SCheng Sean Ye 	else if (strcmp(vendorstr, X86_VENDORSTR_NexGen) == 0)
1013e4b86885SCheng Sean Ye 		return (X86_VENDOR_NexGen);
1014e4b86885SCheng Sean Ye 	else if (strcmp(vendorstr, X86_VENDORSTR_Centaur) == 0)
1015e4b86885SCheng Sean Ye 		return (X86_VENDOR_Centaur);
1016e4b86885SCheng Sean Ye 	else if (strcmp(vendorstr, X86_VENDORSTR_Rise) == 0)
1017e4b86885SCheng Sean Ye 		return (X86_VENDOR_Rise);
1018e4b86885SCheng Sean Ye 	else if (strcmp(vendorstr, X86_VENDORSTR_SiS) == 0)
1019e4b86885SCheng Sean Ye 		return (X86_VENDOR_SiS);
1020e4b86885SCheng Sean Ye 	else if (strcmp(vendorstr, X86_VENDORSTR_NSC) == 0)
1021e4b86885SCheng Sean Ye 		return (X86_VENDOR_NSC);
1022e4b86885SCheng Sean Ye 	else
1023e4b86885SCheng Sean Ye 		return (X86_VENDOR_IntelClone);
1024e4b86885SCheng Sean Ye }
1025