diff options
author | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2014-02-08 07:34:09 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-02-18 15:38:37 -0500 |
commit | 67bad2fdb754dbef14596c0b5d28b3a12c8dfe84 (patch) | |
tree | 05c3cd5f809618319346f9642549460f95149f02 /scripts/mod | |
parent | 91219a3b20325689eb80f7598cce2dc745db171d (diff) |
cpu: add generic support for CPU feature based module autoloading
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.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'scripts/mod')
-rw-r--r-- | scripts/mod/devicetable-offsets.c | 3 | ||||
-rw-r--r-- | scripts/mod/file2alias.c | 10 |
2 files changed, 13 insertions, 0 deletions
diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetable-offsets.c index bb5d115ca671..f282516acc7b 100644 --- a/scripts/mod/devicetable-offsets.c +++ b/scripts/mod/devicetable-offsets.c | |||
@@ -174,6 +174,9 @@ int main(void) | |||
174 | DEVID_FIELD(x86_cpu_id, model); | 174 | DEVID_FIELD(x86_cpu_id, model); |
175 | DEVID_FIELD(x86_cpu_id, vendor); | 175 | DEVID_FIELD(x86_cpu_id, vendor); |
176 | 176 | ||
177 | DEVID(cpu_feature); | ||
178 | DEVID_FIELD(cpu_feature, feature); | ||
179 | |||
177 | DEVID(mei_cl_device_id); | 180 | DEVID(mei_cl_device_id); |
178 | DEVID_FIELD(mei_cl_device_id, name); | 181 | DEVID_FIELD(mei_cl_device_id, name); |
179 | 182 | ||
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 25e5cb0aaef6..506146e5f4a8 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
@@ -1135,6 +1135,16 @@ static int do_x86cpu_entry(const char *filename, void *symval, | |||
1135 | } | 1135 | } |
1136 | ADD_TO_DEVTABLE("x86cpu", x86_cpu_id, do_x86cpu_entry); | 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 | /* Looks like: mei:S */ | 1148 | /* Looks like: mei:S */ |
1139 | static int do_mei_entry(const char *filename, void *symval, | 1149 | static int do_mei_entry(const char *filename, void *symval, |
1140 | char *alias) | 1150 | char *alias) |