-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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>
- Loading branch information
Ard Biesheuvel
authored and
Greg Kroah-Hartman
committed
Feb 18, 2014
1 parent
91219a3
commit 67bad2f
Showing
6 changed files
with
135 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
/* | ||
* Copyright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#ifndef __LINUX_CPUFEATURE_H | ||
#define __LINUX_CPUFEATURE_H | ||
|
||
#ifdef CONFIG_GENERIC_CPU_AUTOPROBE | ||
|
||
#include <linux/mod_devicetable.h> | ||
#include <asm/cpufeature.h> | ||
|
||
/* | ||
* Macros imported from <asm/cpufeature.h>: | ||
* - cpu_feature(x) ordinal value of feature called 'x' | ||
* - cpu_have_feature(u32 n) whether feature #n is available | ||
* - MAX_CPU_FEATURES upper bound for feature ordinal values | ||
* Optional: | ||
* - CPU_FEATURE_TYPEFMT format string fragment for printing the cpu type | ||
* - CPU_FEATURE_TYPEVAL set of values matching the format string above | ||
*/ | ||
|
||
#ifndef CPU_FEATURE_TYPEFMT | ||
#define CPU_FEATURE_TYPEFMT "%s" | ||
#endif | ||
|
||
#ifndef CPU_FEATURE_TYPEVAL | ||
#define CPU_FEATURE_TYPEVAL ELF_PLATFORM | ||
#endif | ||
|
||
/* | ||
* Use module_cpu_feature_match(feature, module_init_function) to | ||
* declare that | ||
* a) the module shall be probed upon discovery of CPU feature 'feature' | ||
* (typically at boot time using udev) | ||
* b) the module must not be loaded if CPU feature 'feature' is not present | ||
* (not even by manual insmod). | ||
* | ||
* For a list of legal values for 'feature', please consult the file | ||
* 'asm/cpufeature.h' of your favorite architecture. | ||
*/ | ||
#define module_cpu_feature_match(x, __init) \ | ||
static struct cpu_feature const cpu_feature_match_ ## x[] = \ | ||
{ { .feature = cpu_feature(x) }, { } }; \ | ||
MODULE_DEVICE_TABLE(cpu, cpu_feature_match_ ## x); \ | ||
\ | ||
static int cpu_feature_match_ ## x ## _init(void) \ | ||
{ \ | ||
if (!cpu_have_feature(cpu_feature(x))) \ | ||
return -ENODEV; \ | ||
return __init(); \ | ||
} \ | ||
module_init(cpu_feature_match_ ## x ## _init) | ||
|
||
#endif | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters