x86: align x86 arch with generic CPU modalias handling
authorArd Biesheuvel <ard.biesheuvel@linaro.org>
Sat, 8 Feb 2014 12:34:10 +0000 (13:34 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 18 Feb 2014 20:45:38 +0000 (12:45 -0800)
The x86 CPU feature modalias handling existed before it was reimplemented
generically. This patch aligns the x86 handling so that it
(a) reuses some more code that is now generic;
(b) uses the generic format for the modalias module metadata entry, i.e., it
    now uses 'cpu:type:x86,venVVVVfamFFFFmodMMMM:feature:,XXXX,YYYY' instead of
    the 'x86cpu:vendor:VVVV:family:FFFF:model:MMMM:feature:,XXXX,YYYY' that was
    used before.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Acked-by: H. Peter Anvin <hpa@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/x86/Kconfig
arch/x86/include/asm/cpufeature.h
arch/x86/kernel/cpu/match.c
drivers/base/Kconfig
drivers/base/cpu.c
include/linux/cpu.h
scripts/mod/file2alias.c

index 0af5250..7fab7e0 100644 (file)
@@ -127,6 +127,7 @@ config X86
        select HAVE_DEBUG_STACKOVERFLOW
        select HAVE_IRQ_EXIT_ON_IRQ_STACK if X86_64
        select HAVE_CC_STACKPROTECTOR
+       select GENERIC_CPU_AUTOPROBE
 
 config INSTRUCTION_DECODER
        def_bool y
@@ -195,9 +196,6 @@ config ARCH_HAS_CPU_RELAX
 config ARCH_HAS_CACHE_LINE_SIZE
        def_bool y
 
-config ARCH_HAS_CPU_AUTOPROBE
-       def_bool y
-
 config HAVE_SETUP_PER_CPU_AREA
        def_bool y
 
index e099f95..d86dc3d 100644 (file)
@@ -541,6 +541,13 @@ static __always_inline __pure bool _static_cpu_has_safe(u16 bit)
 #define static_cpu_has_bug(bit)        static_cpu_has((bit))
 #define boot_cpu_has_bug(bit)  cpu_has_bug(&boot_cpu_data, (bit))
 
+#define MAX_CPU_FEATURES       (NCAPINTS * 32)
+#define cpu_have_feature       boot_cpu_has
+
+#define CPU_FEATURE_TYPEFMT    "x86,ven%04Xfam%04Xmod%04X"
+#define CPU_FEATURE_TYPEVAL    boot_cpu_data.x86_vendor, boot_cpu_data.x86, \
+                               boot_cpu_data.x86_model
+
 #endif /* defined(__KERNEL__) && !defined(__ASSEMBLY__) */
 
 #endif /* _ASM_X86_CPUFEATURE_H */
index 3656537..afa9f0d 100644 (file)
@@ -47,45 +47,3 @@ const struct x86_cpu_id *x86_match_cpu(const struct x86_cpu_id *match)
        return NULL;
 }
 EXPORT_SYMBOL(x86_match_cpu);
-
-ssize_t arch_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 -= 1;
-       for (i = 0; i < NCAPINTS*32; i++) {
-               if (boot_cpu_has(i)) {
-                       n = snprintf(buf, size, ",%04X", i);
-                       if (n >= size) {
-                               WARN(1, "x86 features overflow page\n");
-                               break;
-                       }
-                       size -= n;
-                       buf += n;
-               }
-       }
-       *buf++ = '\n';
-       return buf - bufptr;
-}
-
-int arch_cpu_uevent(struct device *dev, struct kobj_uevent_env *env)
-{
-       char *buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
-       if (buf) {
-               arch_print_cpu_modalias(NULL, NULL, buf);
-               add_uevent_var(env, "MODALIAS=%s", buf);
-               kfree(buf);
-       }
-       return 0;
-}
index 3f0d373..8fa8dea 100644 (file)
@@ -185,13 +185,8 @@ config GENERIC_CPU_DEVICES
        bool
        default n
 
-config HAVE_CPU_AUTOPROBE
-       def_bool ARCH_HAS_CPU_AUTOPROBE
-
 config GENERIC_CPU_AUTOPROBE
        bool
-       depends on !ARCH_HAS_CPU_AUTOPROBE
-       select HAVE_CPU_AUTOPROBE
 
 config SOC_BUS
        bool
index 8a38bf8..006b1bc 100644 (file)
@@ -287,7 +287,6 @@ static void cpu_device_release(struct device *dev)
         */
 }
 
-#ifdef CONFIG_HAVE_CPU_AUTOPROBE
 #ifdef CONFIG_GENERIC_CPU_AUTOPROBE
 static ssize_t print_cpu_modalias(struct device *dev,
                                  struct device_attribute *attr,
@@ -310,9 +309,6 @@ static ssize_t print_cpu_modalias(struct device *dev,
        buf[n++] = '\n';
        return n;
 }
-#else
-#define print_cpu_modalias     arch_print_cpu_modalias
-#endif
 
 static int cpu_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
@@ -346,7 +342,7 @@ int register_cpu(struct cpu *cpu, int num)
        cpu->dev.offline_disabled = !cpu->hotpluggable;
        cpu->dev.offline = !cpu_online(num);
        cpu->dev.of_node = of_get_cpu_node(num, NULL);
-#ifdef CONFIG_HAVE_CPU_AUTOPROBE
+#ifdef CONFIG_GENERIC_CPU_AUTOPROBE
        cpu->dev.bus->uevent = cpu_uevent;
 #endif
        cpu->dev.groups = common_cpu_attr_groups;
@@ -370,7 +366,7 @@ struct device *get_cpu_device(unsigned cpu)
 }
 EXPORT_SYMBOL_GPL(get_cpu_device);
 
-#ifdef CONFIG_HAVE_CPU_AUTOPROBE
+#ifdef CONFIG_GENERIC_CPU_AUTOPROBE
 static DEVICE_ATTR(modalias, 0444, print_cpu_modalias, NULL);
 #endif
 
@@ -384,7 +380,7 @@ static struct attribute *cpu_root_attrs[] = {
        &cpu_attrs[2].attr.attr,
        &dev_attr_kernel_max.attr,
        &dev_attr_offline.attr,
-#ifdef CONFIG_HAVE_CPU_AUTOPROBE
+#ifdef CONFIG_GENERIC_CPU_AUTOPROBE
        &dev_attr_modalias.attr,
 #endif
        NULL
index 03e235a..03e962e 100644 (file)
@@ -46,13 +46,6 @@ extern ssize_t arch_cpu_release(const char *, size_t);
 #endif
 struct notifier_block;
 
-#ifdef CONFIG_ARCH_HAS_CPU_AUTOPROBE
-extern int arch_cpu_uevent(struct device *dev, struct kobj_uevent_env *env);
-extern ssize_t arch_print_cpu_modalias(struct device *dev,
-                                      struct device_attribute *attr,
-                                      char *bufptr);
-#endif
-
 /*
  * CPU notifier priorities.
  */
index 506146e..25f6f59 100644 (file)
@@ -1110,7 +1110,7 @@ static int do_amba_entry(const char *filename,
 }
 ADD_TO_DEVTABLE("amba", amba_id, do_amba_entry);
 
-/* LOOKS like x86cpu:vendor:VVVV:family:FFFF:model:MMMM:feature:*,FEAT,*
+/* LOOKS like cpu:type:x86,venVVVVfamFFFFmodMMMM:feature:*,FEAT,*
  * All fields are numbers. It would be nicer to use strings for vendor
  * and feature, but getting those out of the build system here is too
  * complicated.
@@ -1124,10 +1124,10 @@ static int do_x86cpu_entry(const char *filename, void *symval,
        DEF_FIELD(symval, x86_cpu_id, model);
        DEF_FIELD(symval, x86_cpu_id, vendor);
 
-       strcpy(alias, "x86cpu:");
-       ADD(alias, "vendor:",  vendor != X86_VENDOR_ANY, vendor);
-       ADD(alias, ":family:", family != X86_FAMILY_ANY, family);
-       ADD(alias, ":model:",  model  != X86_MODEL_ANY,  model);
+       strcpy(alias, "cpu:type:x86,");
+       ADD(alias, "ven", vendor != X86_VENDOR_ANY, vendor);
+       ADD(alias, "fam", family != X86_FAMILY_ANY, family);
+       ADD(alias, "mod", model  != X86_MODEL_ANY,  model);
        strcat(alias, ":feature:*");
        if (feature != X86_FEATURE_ANY)
                sprintf(alias + strlen(alias), "%04X*", feature);