hc
2024-05-11 04dd17822334871b23ea2862f7798fb0e0007777
kernel/arch/x86/kernel/cpu/match.c
....@@ -16,12 +16,17 @@
1616 * respective wildcard entries.
1717 *
1818 * A typical table entry would be to match a specific CPU
19
- * { X86_VENDOR_INTEL, 6, 0x12 }
20
- * or to match a specific CPU feature
21
- * { X86_FEATURE_MATCH(X86_FEATURE_FOOBAR) }
19
+ *
20
+ * X86_MATCH_VENDOR_FAM_MODEL_FEATURE(INTEL, 6, INTEL_FAM6_BROADWELL,
21
+ * X86_FEATURE_ANY, NULL);
2222 *
2323 * Fields can be wildcarded with %X86_VENDOR_ANY, %X86_FAMILY_ANY,
24
- * %X86_MODEL_ANY, %X86_FEATURE_ANY or 0 (except for vendor)
24
+ * %X86_MODEL_ANY, %X86_FEATURE_ANY (except for vendor)
25
+ *
26
+ * asm/cpu_device_id.h contains a set of useful macros which are shortcuts
27
+ * for various common selections. The above can be shortened to:
28
+ *
29
+ * X86_MATCH_INTEL_FAM6_MODEL(BROADWELL, NULL);
2530 *
2631 * Arrays used to match for this should also be declared using
2732 * MODULE_DEVICE_TABLE(x86cpu, ...)
....@@ -53,3 +58,34 @@
5358 return NULL;
5459 }
5560 EXPORT_SYMBOL(x86_match_cpu);
61
+
62
+static const struct x86_cpu_desc *
63
+x86_match_cpu_with_stepping(const struct x86_cpu_desc *match)
64
+{
65
+ struct cpuinfo_x86 *c = &boot_cpu_data;
66
+ const struct x86_cpu_desc *m;
67
+
68
+ for (m = match; m->x86_family | m->x86_model; m++) {
69
+ if (c->x86_vendor != m->x86_vendor)
70
+ continue;
71
+ if (c->x86 != m->x86_family)
72
+ continue;
73
+ if (c->x86_model != m->x86_model)
74
+ continue;
75
+ if (c->x86_stepping != m->x86_stepping)
76
+ continue;
77
+ return m;
78
+ }
79
+ return NULL;
80
+}
81
+
82
+bool x86_cpu_has_min_microcode_rev(const struct x86_cpu_desc *table)
83
+{
84
+ const struct x86_cpu_desc *res = x86_match_cpu_with_stepping(table);
85
+
86
+ if (!res || res->x86_microcode_rev > boot_cpu_data.microcode)
87
+ return false;
88
+
89
+ return true;
90
+}
91
+EXPORT_SYMBOL_GPL(x86_cpu_has_min_microcode_rev);