summaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/cpuid.c
diff options
context:
space:
mode:
authorThomas Renninger2012-01-26 00:09:14 +0100
committerGreg Kroah-Hartman2012-01-27 01:49:08 +0100
commitfad12ac8c8c2591c7f4e61d19b6a9d76cd49fafa (patch)
treee2a77737265a193bbec7ecfd08f4989931a0ba89 /arch/x86/kernel/cpuid.c
parentx86: autoload microcode driver on Intel and AMD systems v2 (diff)
downloadkernel-qcow2-linux-fad12ac8c8c2591c7f4e61d19b6a9d76cd49fafa.tar.gz
kernel-qcow2-linux-fad12ac8c8c2591c7f4e61d19b6a9d76cd49fafa.tar.xz
kernel-qcow2-linux-fad12ac8c8c2591c7f4e61d19b6a9d76cd49fafa.zip
CPU: Introduce ARCH_HAS_CPU_AUTOPROBE and X86 parts
This patch is based on Andi Kleen's work: Implement autoprobing/loading of modules serving CPU specific features (x86cpu autoloading). And Kay Siever's work to get rid of sysdev cpu structures and making use of struct device instead. Before, the cpuid driver had to be loaded to get the x86cpu autoloading feature. With this patch autoloading works through the /sys/devices/system/cpu object Cc: Kay Sievers <kay.sievers@vrfy.org> Cc: Dave Jones <davej@redhat.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Herbert Xu <herbert@gondor.apana.org.au> Cc: Huang Ying <ying.huang@intel.com> Cc: Len Brown <lenb@kernel.org> Acked-by: Andi Kleen <ak@linux.intel.com> Signed-off-by: Thomas Renninger <trenn@suse.de> Acked-by: H. Peter Anvin <hpa@zytor.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'arch/x86/kernel/cpuid.c')
-rw-r--r--arch/x86/kernel/cpuid.c59
1 files changed, 1 insertions, 58 deletions
diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c
index 7c89880eefd0..a524353d93f2 100644
--- a/arch/x86/kernel/cpuid.c
+++ b/arch/x86/kernel/cpuid.c
@@ -40,7 +40,6 @@
#include <linux/notifier.h>
#include <linux/uaccess.h>
#include <linux/gfp.h>
-#include <linux/slab.h>
#include <asm/processor.h>
#include <asm/msr.h>
@@ -139,57 +138,13 @@ static const struct file_operations cpuid_fops = {
.open = cpuid_open,
};
-static ssize_t print_cpu_modalias(struct device *dev,
- struct device_attribute *attr,
- char *bufptr)
-{
- int size = PAGE_SIZE;
- int i, n;
- char *buf = bufptr;
-
- n = snprintf(buf, size, "x86cpu:vendor:%04X:family:"
- "%04X:model:%04X:feature:",
- boot_cpu_data.x86_vendor,
- boot_cpu_data.x86,
- boot_cpu_data.x86_model);
- size -= n;
- buf += n;
- size -= 2;
- for (i = 0; i < NCAPINTS*32; i++) {
- if (boot_cpu_has(i)) {
- n = snprintf(buf, size, ",%04X", i);
- if (n < 0) {
- WARN(1, "x86 features overflow page\n");
- break;
- }
- size -= n;
- buf += n;
- }
- }
- *buf++ = ',';
- *buf++ = '\n';
- return buf - bufptr;
-}
-
-static DEVICE_ATTR(modalias, 0444, print_cpu_modalias, NULL);
-
static __cpuinit int cpuid_device_create(int cpu)
{
struct device *dev;
- int err;
dev = device_create(cpuid_class, NULL, MKDEV(CPUID_MAJOR, cpu), NULL,
"cpu%d", cpu);
- if (IS_ERR(dev))
- return PTR_ERR(dev);
-
- err = device_create_file(dev, &dev_attr_modalias);
- if (err) {
- /* keep device around on error. attribute is optional. */
- err = 0;
- }
-
- return 0;
+ return IS_ERR(dev) ? PTR_ERR(dev) : 0;
}
static void cpuid_device_destroy(int cpu)
@@ -227,17 +182,6 @@ static char *cpuid_devnode(struct device *dev, umode_t *mode)
return kasprintf(GFP_KERNEL, "cpu/%u/cpuid", MINOR(dev->devt));
}
-static int cpuid_dev_uevent(struct device *dev, struct kobj_uevent_env *env)
-{
- char *buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
- if (buf) {
- print_cpu_modalias(NULL, NULL, buf);
- add_uevent_var(env, "MODALIAS=%s", buf);
- kfree(buf);
- }
- return 0;
-}
-
static int __init cpuid_init(void)
{
int i, err = 0;
@@ -256,7 +200,6 @@ static int __init cpuid_init(void)
goto out_chrdev;
}
cpuid_class->devnode = cpuid_devnode;
- cpuid_class->dev_uevent = cpuid_dev_uevent;
for_each_online_cpu(i) {
err = cpuid_device_create(i);
if (err != 0)