This patch adds support for advertising optional CPU features over udev using the modalias, and for declaring compatibility with/dependency upon such a feature in a module. The mapping between feature numbers and actual features should be provided by the architecture in a file called <asm/cpufeature.h> which exports the following functions/macros: - cpu_feature(FEAT), a preprocessor macro that maps token FEAT to a numeric index; - bool cpu_have_feature(n), returning whether this CPU has support for feature #n; - MAX_CPU_FEATURES, an upper bound for 'n' in the previous function. The feature can then be enabled by setting CONFIG_GENERIC_CPU_AUTOPROBE for the architecture. For instance, a module that registers its module init function using module_cpu_feature_match(FEAT_X, module_init_function) will be probed automatically when the CPU's support for the 'FEAT_X' feature is advertised over udev, and will only allow the module to be loaded by hand if the 'FEAT_X' feature is supported.
Showing the changes to scripts/mod (2 of 6 files). Show all
Unified · Split
| @@ -174,6 +174,9 @@ int main(void) · 173 unmodified lines | ||
| 174 | 174 | DEVID_FIELD(x86_cpu_id, model); |
| 175 | 175 | DEVID_FIELD(x86_cpu_id, vendor); |
| 176 | 176 | |
| 177 | + DEVID(cpu_feature); | |
| 178 | + DEVID_FIELD(cpu_feature, feature); | |
| 179 | + | |
| 177 | 180 | DEVID(mei_cl_device_id); |
| 178 | 181 | DEVID_FIELD(mei_cl_device_id, name); |
| 179 | 182 | |
| @@ -1135,6 +1135,16 @@ static int do_x86cpu_entry(const char *filename, void *symval, · 1134 unmodified lines | ||
| 1135 | 1135 | } |
| 1136 | 1136 | ADD_TO_DEVTABLE("x86cpu", x86_cpu_id, do_x86cpu_entry); |
| 1137 | 1137 | |
| 1138 | +/* LOOKS like cpu:type:*:feature:*FEAT* */ | |
| 1139 | +static int do_cpu_entry(const char *filename, void *symval, char *alias) | |
| 1140 | +{ | |
| 1141 | + DEF_FIELD(symval, cpu_feature, feature); | |
| 1142 | + | |
| 1143 | + sprintf(alias, "cpu:type:*:feature:*%04X*", feature); | |
| 1144 | + return 1; | |
| 1145 | +} | |
| 1146 | +ADD_TO_DEVTABLE("cpu", cpu_feature, do_cpu_entry); | |
| 1147 | + | |
| 1138 | 1148 | /* Looks like: mei:S */ |
| 1139 | 1149 | static int do_mei_entry(const char *filename, void *symval, |
| 1140 | 1150 | char *alias) |