Module Name:    src
Committed By:   mrg
Date:           Fri Jul 28 05:02:13 UTC 2023

Modified Files:
        src/sys/arch/x86/x86: errata.c

Log Message:
x86: make the CPUID list for errata be far less confusing

the 0x80000001 CPUID result needs some parsing to match against
actual family/model/stepping values.  4-bit 'family' values of
15 or 6 change how to parse the 4-bit extended model and 8-bit
extended family value - for family 6 or 15, the extended model
bits (4) are concatenated with the base 4-bits to create an
8-bit value, and for family 15, the family value is addition
of the family value and the 8-bit extended-family value, giving
a range of 0 to 15 + 0xff aka 270.

use a CPUREV(family, model, stepping) macro that builds the
relevant bit-representation of a CPUID, making it far easier
to understand what each entry means, and to add new ones too.

i have confirmed that the emitted cpurevs[] array has the same
values before/after this change, ie, NFCI or observed.


To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/x86/x86/errata.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/x86/x86/errata.c
diff -u src/sys/arch/x86/x86/errata.c:1.32 src/sys/arch/x86/x86/errata.c:1.33
--- src/sys/arch/x86/x86/errata.c:1.32	Wed Jul 26 00:19:04 2023
+++ src/sys/arch/x86/x86/errata.c	Fri Jul 28 05:02:13 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: errata.c,v 1.32 2023/07/26 00:19:04 mrg Exp $	*/
+/*	$NetBSD: errata.c,v 1.33 2023/07/28 05:02:13 mrg Exp $	*/
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -47,7 +47,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: errata.c,v 1.32 2023/07/26 00:19:04 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: errata.c,v 1.33 2023/07/28 05:02:13 mrg Exp $");
 
 #include <sys/types.h>
 #include <sys/systm.h>
@@ -68,40 +68,118 @@ typedef struct errata {
 	uint64_t	e_data2;
 } errata_t;
 
+/* These names match names from various AMD Errata/Revision Guides. */
 typedef enum cpurev {
+	/* K8 / Family 0Fh */
 	BH_E4, CH_CG, CH_D0, DH_CG, DH_D0, DH_E3, DH_E6, JH_E1,
 	JH_E6, SH_B0, SH_B3, SH_C0, SH_CG, SH_D0, SH_E4, SH_E5,
+
+	/* K10 / Family 10h */
 	DR_BA, DR_B2, DR_B3, RB_C2, RB_C3, BL_C2, BL_C3, DA_C2,
-	DA_C3, HY_D0, HY_D1, HY_D1_G34R1,  PH_E0, LN_B0, KB_A1,
-	ML_A1, ZP_B1, ZP_B2, PiR_B2, Rome_B0, Z2_XB, Z2_Ren,
-	Z2_Luc, Z2_Mat, Z2_VG, Z2_Men, Milan_B1, Milan_B2, Genoa_B1,
+	DA_C3, HY_D0, HY_D1, HY_D1_G34R1,  PH_E0,
+
+	/* Llano / Family 12h */
+	LN_B0,
+
+	/* Jaguar / Family 16h */
+	KB_A1, ML_A1,
+
+	/* Zen/Zen+/Zen2 / Family 17h */
+	ZP_B1, ZP_B2, PiR_B2, Rome_B0,
+
+	/* XXX client Zen2 names aren't known yet. */
+	Z2_XB, Z2_Ren, Z2_Luc, Z2_Mat, Z2_VG, Z2_Men,
+
+	/* Zen3/Zen4 / Family 19h */
+	Milan_B1, Milan_B2, Genoa_B1,
 	OINK
 } cpurev_t;
 
-/* These names match names from various AMD Errata/Revision Guides. */
+/*
+ * The bit-layout in the 0x80000001 CPUID result is, with bit-size
+ * as the final number here:
+ *
+ *    resv1_4 extfam_8 extmodel_4 resv2_4 fam_4 model_4 stepping_4
+ *
+ * The CPUREV(family,model,stepping) macro handles the mapping for
+ * family 6 and family 15 in the "fam_4" nybble, if 6 or 15, the
+ * extended model is present and is bit-concatenated, and if 15,
+ * the extended family is additional (ie, family 0x10 is 0xF in
+ * fam_4 and 0x01 in extfam_8.)
+ */
+#define CPUREV(fam,mod,step)				\
+	(((fam) > 0xf ?					\
+	  (0xf << 8) | ((fam) - 0xf) << 20 :		\
+	  (fam) << 8) |					\
+	 (((mod) & 0xf) << 4) |				\
+	 (((fam) == 6 || ((fam) >= 0xf)) ?		\
+	  ((mod) & 0xf0) << 12 : 0) |			\
+	 ((step) & 0xf))
 static const u_int cpurevs[] = {
-	BH_E4, 0x0020fb1, CH_CG, 0x0000f82, CH_CG, 0x0000fb2,
-	CH_D0, 0x0010f80, CH_D0, 0x0010fb0, DH_CG, 0x0000fc0,
-	DH_CG, 0x0000fe0, DH_CG, 0x0000ff0, DH_D0, 0x0010fc0,
-	DH_D0, 0x0010ff0, DH_E3, 0x0020fc0, DH_E3, 0x0020ff0,
-	DH_E6, 0x0020fc2, DH_E6, 0x0020ff2, JH_E1, 0x0020f10,
-	JH_E6, 0x0020f12, JH_E6, 0x0020f32, SH_B0, 0x0000f40,
-	SH_B3, 0x0000f51, SH_C0, 0x0000f48, SH_C0, 0x0000f58,
-	SH_CG, 0x0000f4a, SH_CG, 0x0000f5a, SH_CG, 0x0000f7a,
-	SH_D0, 0x0010f40, SH_D0, 0x0010f50, SH_D0, 0x0010f70,
-	SH_E4, 0x0020f51, SH_E4, 0x0020f71, SH_E5, 0x0020f42,
-	DR_BA, 0x0100f2a, DR_B2, 0x0100f22, DR_B3, 0x0100f23,
-	RB_C2, 0x0100f42, RB_C3, 0x0100f43, BL_C2, 0x0100f52,
-	BL_C3, 0x0100f53, DA_C2, 0x0100f62, DA_C3, 0x0100f63,
-	HY_D0, 0x0100f80, HY_D1, 0x0100f81, HY_D1_G34R1, 0x0100f91,
-	PH_E0, 0x0100fa0, LN_B0, 0x0300f10, KB_A1, 0x0700F01,
-	ML_A1, 0x0730F01, ZP_B1, 0x0800F11, ZP_B2, 0x0800F12,
-	PiR_B2, 0x0800F82, Rome_B0, 0x0830F10,
-	/* XXX client Zen2 names aren't known yet. */
-	Z2_XB, 0x0840F70, Z2_Ren, 0x0860F01, Z2_Luc, 0x0860F81,
-	Z2_Mat, 0x0870F10, Z2_VG, 0x0890F02, Z2_Men, 0x08A0F00,
-	Milan_B1, 0x0A00F11, Milan_B2, 0x0A00F12,
-	Genoa_B1, 0x0A10F11,
+	BH_E4,		CPUREV(0x0F, 0x2B, 0x1),
+	CH_CG,		CPUREV(0x0F, 0x08, 0x2),
+	CH_CG,		CPUREV(0x0F, 0x0B, 0x2),
+	CH_D0,		CPUREV(0x0F, 0x18, 0x0),
+	CH_D0,		CPUREV(0x0F, 0x1B, 0x0),
+	DH_CG,		CPUREV(0x0F, 0x0C, 0x0),
+	DH_CG,		CPUREV(0x0F, 0x0E, 0x0),
+	DH_CG,		CPUREV(0x0F, 0x0F, 0x0),
+	DH_D0,		CPUREV(0x0F, 0x1C, 0x0),
+	DH_D0,		CPUREV(0x0F, 0x1F, 0x0),
+	DH_E3,		CPUREV(0x0F, 0x2C, 0x0),
+	DH_E3,		CPUREV(0x0F, 0x2F, 0x0),
+	DH_E6,		CPUREV(0x0F, 0x2C, 0x2),
+	DH_E6,		CPUREV(0x0F, 0x2F, 0x2),
+	JH_E1,		CPUREV(0x0F, 0x21, 0x0),
+	JH_E6,		CPUREV(0x0F, 0x21, 0x2),
+	JH_E6,		CPUREV(0x0F, 0x23, 0x2),
+	SH_B0,		CPUREV(0x0F, 0x04, 0x0),
+	SH_B3,		CPUREV(0x0F, 0x05, 0x1),
+	SH_C0,		CPUREV(0x0F, 0x04, 0x8),
+	SH_C0,		CPUREV(0x0F, 0x05, 0x8),
+	SH_CG,		CPUREV(0x0F, 0x04, 0xA),
+	SH_CG,		CPUREV(0x0F, 0x05, 0xA),
+	SH_CG,		CPUREV(0x0F, 0x07, 0xA),
+	SH_D0,		CPUREV(0x0F, 0x14, 0x0),
+	SH_D0,		CPUREV(0x0F, 0x15, 0x0),
+	SH_D0,		CPUREV(0x0F, 0x17, 0x0),
+	SH_E4,		CPUREV(0x0F, 0x25, 0x1),
+	SH_E4,		CPUREV(0x0F, 0x27, 0x1),
+	SH_E5,		CPUREV(0x0F, 0x24, 0x2),
+
+	DR_BA,		CPUREV(0x10, 0x02, 0xA),
+	DR_B2,		CPUREV(0x10, 0x02, 0x2),
+	DR_B3,		CPUREV(0x10, 0x02, 0x3),
+	RB_C2,		CPUREV(0x10, 0x04, 0x2),
+	RB_C3,		CPUREV(0x10, 0x04, 0x3),
+	BL_C2,		CPUREV(0x10, 0x05, 0x2),
+	BL_C3,		CPUREV(0x10, 0x05, 0x3),
+	DA_C2,		CPUREV(0x10, 0x06, 0x2),
+	DA_C3,		CPUREV(0x10, 0x06, 0x3),
+	HY_D0,		CPUREV(0x10, 0x08, 0x0),
+	HY_D1,		CPUREV(0x10, 0x08, 0x1),
+	HY_D1_G34R1,	CPUREV(0x10, 0x09, 0x1),
+	PH_E0,		CPUREV(0x10, 0x0A, 0x0),
+
+	LN_B0,		CPUREV(0x12, 0x01, 0x0),
+
+	KB_A1,		CPUREV(0x16, 0x00, 0x1),
+	ML_A1,		CPUREV(0x16, 0x30, 0x1),
+
+	ZP_B1,		CPUREV(0x17, 0x01, 0x1),
+	ZP_B2,		CPUREV(0x17, 0x01, 0x2),
+	PiR_B2,		CPUREV(0x17, 0x08, 0x2),
+	Rome_B0,	CPUREV(0x17, 0x31, 0x0),
+	Z2_XB,		CPUREV(0x17, 0x47, 0x0),
+	Z2_Ren,		CPUREV(0x17, 0x60, 0x1),
+	Z2_Luc,		CPUREV(0x17, 0x68, 0x1),
+	Z2_Mat,		CPUREV(0x17, 0x71, 0x0),
+	Z2_VG,		CPUREV(0x17, 0x90, 0x2),
+	Z2_Men,		CPUREV(0x17, 0xA0, 0x0),
+
+	Milan_B1,	CPUREV(0x19, 0x01, 0x1),
+	Milan_B2,	CPUREV(0x19, 0x01, 0x2),
+	Genoa_B1,	CPUREV(0x19, 0x11, 0x1),
 	OINK
 };
 

Reply via email to