| .. | .. | 
|---|
| 1 | 1 |  /* SPDX-License-Identifier: GPL-2.0 */ | 
|---|
| 2 |  | -#ifndef _CPU_DEVICE_ID  | 
|---|
| 3 |  | -#define _CPU_DEVICE_ID 1  | 
|---|
 | 2 | +#ifndef _ASM_X86_CPU_DEVICE_ID  | 
|---|
 | 3 | +#define _ASM_X86_CPU_DEVICE_ID  | 
|---|
| 4 | 4 |   | 
|---|
| 5 | 5 |  /* | 
|---|
| 6 | 6 |   * Declare drivers belonging to specific x86 CPUs | 
|---|
| 7 | 7 |   * Similar in spirit to pci_device_id and related PCI functions | 
|---|
 | 8 | + *  | 
|---|
 | 9 | + * The wildcard initializers are in mod_devicetable.h because  | 
|---|
 | 10 | + * file2alias needs them. Sigh.  | 
|---|
| 8 | 11 |   */ | 
|---|
| 9 |  | -  | 
|---|
| 10 | 12 |  #include <linux/mod_devicetable.h> | 
|---|
 | 13 | +/* Get the INTEL_FAM* model defines */  | 
|---|
 | 14 | +#include <asm/intel-family.h>  | 
|---|
 | 15 | +/* And the X86_VENDOR_* ones */  | 
|---|
 | 16 | +#include <asm/processor.h>  | 
|---|
 | 17 | +  | 
|---|
 | 18 | +/* Centaur FAM6 models */  | 
|---|
 | 19 | +#define X86_CENTAUR_FAM6_C7_A		0xa  | 
|---|
 | 20 | +#define X86_CENTAUR_FAM6_C7_D		0xd  | 
|---|
 | 21 | +#define X86_CENTAUR_FAM6_NANO		0xf  | 
|---|
| 11 | 22 |   | 
|---|
| 12 | 23 |  #define X86_STEPPINGS(mins, maxs)    GENMASK(maxs, mins) | 
|---|
| 13 |  | -  | 
|---|
| 14 | 24 |  /** | 
|---|
| 15 | 25 |   * X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE - Base macro for CPU matching | 
|---|
| 16 | 26 |   * @_vendor:	The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY | 
|---|
| .. | .. | 
|---|
| 23 | 33 |   *		format is unsigned long. The supplied value, pointer | 
|---|
| 24 | 34 |   *		etc. is casted to unsigned long internally. | 
|---|
| 25 | 35 |   * | 
|---|
| 26 |  | - * Backport version to keep the SRBDS pile consistant. No shorter variants  | 
|---|
| 27 |  | - * required for this.  | 
|---|
 | 36 | + * Use only if you need all selectors. Otherwise use one of the shorter  | 
|---|
 | 37 | + * macros of the X86_MATCH_* family. If there is no matching shorthand  | 
|---|
 | 38 | + * macro, consider to add one. If you really need to wrap one of the macros  | 
|---|
 | 39 | + * into another macro at the usage site for good reasons, then please  | 
|---|
 | 40 | + * start this local macro with X86_MATCH to allow easy grepping.  | 
|---|
| 28 | 41 |   */ | 
|---|
| 29 | 42 |  #define X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE(_vendor, _family, _model, \ | 
|---|
| 30 | 43 |  						    _steppings, _feature, _data) { \ | 
|---|
| .. | .. | 
|---|
| 36 | 49 |  	.driver_data	= (unsigned long) _data				\ | 
|---|
| 37 | 50 |  } | 
|---|
| 38 | 51 |   | 
|---|
| 39 |  | -extern const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match);  | 
|---|
 | 52 | +/**  | 
|---|
 | 53 | + * X86_MATCH_VENDOR_FAM_MODEL_FEATURE - Macro for CPU matching  | 
|---|
 | 54 | + * @_vendor:	The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY  | 
|---|
 | 55 | + *		The name is expanded to X86_VENDOR_@_vendor  | 
|---|
 | 56 | + * @_family:	The family number or X86_FAMILY_ANY  | 
|---|
 | 57 | + * @_model:	The model number, model constant or X86_MODEL_ANY  | 
|---|
 | 58 | + * @_feature:	A X86_FEATURE bit or X86_FEATURE_ANY  | 
|---|
 | 59 | + * @_data:	Driver specific data or NULL. The internal storage  | 
|---|
 | 60 | + *		format is unsigned long. The supplied value, pointer  | 
|---|
 | 61 | + *		etc. is casted to unsigned long internally.  | 
|---|
 | 62 | + *  | 
|---|
 | 63 | + * The steppings arguments of X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE() is  | 
|---|
 | 64 | + * set to wildcards.  | 
|---|
 | 65 | + */  | 
|---|
 | 66 | +#define X86_MATCH_VENDOR_FAM_MODEL_FEATURE(vendor, family, model, feature, data) \  | 
|---|
 | 67 | +	X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE(vendor, family, model, \  | 
|---|
 | 68 | +						X86_STEPPING_ANY, feature, data)  | 
|---|
| 40 | 69 |   | 
|---|
| 41 |  | -#endif  | 
|---|
 | 70 | +/**  | 
|---|
 | 71 | + * X86_MATCH_VENDOR_FAM_FEATURE - Macro for matching vendor, family and CPU feature  | 
|---|
 | 72 | + * @vendor:	The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY  | 
|---|
 | 73 | + *		The name is expanded to X86_VENDOR_@vendor  | 
|---|
 | 74 | + * @family:	The family number or X86_FAMILY_ANY  | 
|---|
 | 75 | + * @feature:	A X86_FEATURE bit  | 
|---|
 | 76 | + * @data:	Driver specific data or NULL. The internal storage  | 
|---|
 | 77 | + *		format is unsigned long. The supplied value, pointer  | 
|---|
 | 78 | + *		etc. is casted to unsigned long internally.  | 
|---|
 | 79 | + *  | 
|---|
 | 80 | + * All other missing arguments of X86_MATCH_VENDOR_FAM_MODEL_FEATURE() are  | 
|---|
 | 81 | + * set to wildcards.  | 
|---|
 | 82 | + */  | 
|---|
 | 83 | +#define X86_MATCH_VENDOR_FAM_FEATURE(vendor, family, feature, data)	\  | 
|---|
 | 84 | +	X86_MATCH_VENDOR_FAM_MODEL_FEATURE(vendor, family,		\  | 
|---|
 | 85 | +					   X86_MODEL_ANY, feature, data)  | 
|---|
 | 86 | +  | 
|---|
 | 87 | +/**  | 
|---|
 | 88 | + * X86_MATCH_VENDOR_FEATURE - Macro for matching vendor and CPU feature  | 
|---|
 | 89 | + * @vendor:	The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY  | 
|---|
 | 90 | + *		The name is expanded to X86_VENDOR_@vendor  | 
|---|
 | 91 | + * @feature:	A X86_FEATURE bit  | 
|---|
 | 92 | + * @data:	Driver specific data or NULL. The internal storage  | 
|---|
 | 93 | + *		format is unsigned long. The supplied value, pointer  | 
|---|
 | 94 | + *		etc. is casted to unsigned long internally.  | 
|---|
 | 95 | + *  | 
|---|
 | 96 | + * All other missing arguments of X86_MATCH_VENDOR_FAM_MODEL_FEATURE() are  | 
|---|
 | 97 | + * set to wildcards.  | 
|---|
 | 98 | + */  | 
|---|
 | 99 | +#define X86_MATCH_VENDOR_FEATURE(vendor, feature, data)			\  | 
|---|
 | 100 | +	X86_MATCH_VENDOR_FAM_FEATURE(vendor, X86_FAMILY_ANY, feature, data)  | 
|---|
 | 101 | +  | 
|---|
 | 102 | +/**  | 
|---|
 | 103 | + * X86_MATCH_FEATURE - Macro for matching a CPU feature  | 
|---|
 | 104 | + * @feature:	A X86_FEATURE bit  | 
|---|
 | 105 | + * @data:	Driver specific data or NULL. The internal storage  | 
|---|
 | 106 | + *		format is unsigned long. The supplied value, pointer  | 
|---|
 | 107 | + *		etc. is casted to unsigned long internally.  | 
|---|
 | 108 | + *  | 
|---|
 | 109 | + * All other missing arguments of X86_MATCH_VENDOR_FAM_MODEL_FEATURE() are  | 
|---|
 | 110 | + * set to wildcards.  | 
|---|
 | 111 | + */  | 
|---|
 | 112 | +#define X86_MATCH_FEATURE(feature, data)				\  | 
|---|
 | 113 | +	X86_MATCH_VENDOR_FEATURE(ANY, feature, data)  | 
|---|
 | 114 | +  | 
|---|
 | 115 | +/**  | 
|---|
 | 116 | + * X86_MATCH_VENDOR_FAM_MODEL - Match vendor, family and model  | 
|---|
 | 117 | + * @vendor:	The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY  | 
|---|
 | 118 | + *		The name is expanded to X86_VENDOR_@vendor  | 
|---|
 | 119 | + * @family:	The family number or X86_FAMILY_ANY  | 
|---|
 | 120 | + * @model:	The model number, model constant or X86_MODEL_ANY  | 
|---|
 | 121 | + * @data:	Driver specific data or NULL. The internal storage  | 
|---|
 | 122 | + *		format is unsigned long. The supplied value, pointer  | 
|---|
 | 123 | + *		etc. is casted to unsigned long internally.  | 
|---|
 | 124 | + *  | 
|---|
 | 125 | + * All other missing arguments of X86_MATCH_VENDOR_FAM_MODEL_FEATURE() are  | 
|---|
 | 126 | + * set to wildcards.  | 
|---|
 | 127 | + */  | 
|---|
 | 128 | +#define X86_MATCH_VENDOR_FAM_MODEL(vendor, family, model, data)		\  | 
|---|
 | 129 | +	X86_MATCH_VENDOR_FAM_MODEL_FEATURE(vendor, family, model,	\  | 
|---|
 | 130 | +					   X86_FEATURE_ANY, data)  | 
|---|
 | 131 | +  | 
|---|
 | 132 | +/**  | 
|---|
 | 133 | + * X86_MATCH_VENDOR_FAM - Match vendor and family  | 
|---|
 | 134 | + * @vendor:	The vendor name, e.g. INTEL, AMD, HYGON, ..., ANY  | 
|---|
 | 135 | + *		The name is expanded to X86_VENDOR_@vendor  | 
|---|
 | 136 | + * @family:	The family number or X86_FAMILY_ANY  | 
|---|
 | 137 | + * @data:	Driver specific data or NULL. The internal storage  | 
|---|
 | 138 | + *		format is unsigned long. The supplied value, pointer  | 
|---|
 | 139 | + *		etc. is casted to unsigned long internally.  | 
|---|
 | 140 | + *  | 
|---|
 | 141 | + * All other missing arguments to X86_MATCH_VENDOR_FAM_MODEL_FEATURE() are  | 
|---|
 | 142 | + * set of wildcards.  | 
|---|
 | 143 | + */  | 
|---|
 | 144 | +#define X86_MATCH_VENDOR_FAM(vendor, family, data)			\  | 
|---|
 | 145 | +	X86_MATCH_VENDOR_FAM_MODEL(vendor, family, X86_MODEL_ANY, data)  | 
|---|
 | 146 | +  | 
|---|
 | 147 | +/**  | 
|---|
 | 148 | + * X86_MATCH_INTEL_FAM6_MODEL - Match vendor INTEL, family 6 and model  | 
|---|
 | 149 | + * @model:	The model name without the INTEL_FAM6_ prefix or ANY  | 
|---|
 | 150 | + *		The model name is expanded to INTEL_FAM6_@model internally  | 
|---|
 | 151 | + * @data:	Driver specific data or NULL. The internal storage  | 
|---|
 | 152 | + *		format is unsigned long. The supplied value, pointer  | 
|---|
 | 153 | + *		etc. is casted to unsigned long internally.  | 
|---|
 | 154 | + *  | 
|---|
 | 155 | + * The vendor is set to INTEL, the family to 6 and all other missing  | 
|---|
 | 156 | + * arguments of X86_MATCH_VENDOR_FAM_MODEL_FEATURE() are set to wildcards.  | 
|---|
 | 157 | + *  | 
|---|
 | 158 | + * See X86_MATCH_VENDOR_FAM_MODEL_FEATURE() for further information.  | 
|---|
 | 159 | + */  | 
|---|
 | 160 | +#define X86_MATCH_INTEL_FAM6_MODEL(model, data)				\  | 
|---|
 | 161 | +	X86_MATCH_VENDOR_FAM_MODEL(INTEL, 6, INTEL_FAM6_##model, data)  | 
|---|
 | 162 | +  | 
|---|
 | 163 | +#define X86_MATCH_INTEL_FAM6_MODEL_STEPPINGS(model, steppings, data)	\  | 
|---|
 | 164 | +	X86_MATCH_VENDOR_FAM_MODEL_STEPPINGS_FEATURE(INTEL, 6, INTEL_FAM6_##model, \  | 
|---|
 | 165 | +						     steppings, X86_FEATURE_ANY, data)  | 
|---|
 | 166 | +  | 
|---|
 | 167 | +/*  | 
|---|
 | 168 | + * Match specific microcode revisions.  | 
|---|
 | 169 | + *  | 
|---|
 | 170 | + * vendor/family/model/stepping must be all set.  | 
|---|
 | 171 | + *  | 
|---|
 | 172 | + * Only checks against the boot CPU.  When mixed-stepping configs are  | 
|---|
 | 173 | + * valid for a CPU model, add a quirk for every valid stepping and  | 
|---|
 | 174 | + * do the fine-tuning in the quirk handler.  | 
|---|
 | 175 | + */  | 
|---|
 | 176 | +  | 
|---|
 | 177 | +struct x86_cpu_desc {  | 
|---|
 | 178 | +	u8	x86_family;  | 
|---|
 | 179 | +	u8	x86_vendor;  | 
|---|
 | 180 | +	u8	x86_model;  | 
|---|
 | 181 | +	u8	x86_stepping;  | 
|---|
 | 182 | +	u32	x86_microcode_rev;  | 
|---|
 | 183 | +};  | 
|---|
 | 184 | +  | 
|---|
 | 185 | +#define INTEL_CPU_DESC(model, stepping, revision) {		\  | 
|---|
 | 186 | +	.x86_family		= 6,				\  | 
|---|
 | 187 | +	.x86_vendor		= X86_VENDOR_INTEL,		\  | 
|---|
 | 188 | +	.x86_model		= (model),			\  | 
|---|
 | 189 | +	.x86_stepping		= (stepping),			\  | 
|---|
 | 190 | +	.x86_microcode_rev	= (revision),			\  | 
|---|
 | 191 | +}  | 
|---|
 | 192 | +  | 
|---|
 | 193 | +extern const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match);  | 
|---|
 | 194 | +extern bool x86_cpu_has_min_microcode_rev(const struct x86_cpu_desc *table);  | 
|---|
 | 195 | +  | 
|---|
 | 196 | +#endif /* _ASM_X86_CPU_DEVICE_ID */  | 
|---|