x86: align x86 arch with generic CPU modalias handling
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👪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>
This commit is contained in:
Родитель
67bad2fdb7
Коммит
2b9c1f0327
|
@ -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
|
||||
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче