diff options
| -rw-r--r-- | arch/x86/Kconfig.cpu | 2 | ||||
| -rw-r--r-- | arch/x86/Makefile_32.cpu | 2 | ||||
| -rw-r--r-- | arch/x86/include/asm/msr.h | 8 | ||||
| -rw-r--r-- | arch/x86/kernel/cpuid.c | 17 | ||||
| -rw-r--r-- | arch/x86/kernel/msr.c | 16 | ||||
| -rw-r--r-- | arch/x86/lib/msr.c | 46 |
6 files changed, 37 insertions, 54 deletions
diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu index 2649840d888f..5e99762eb5c2 100644 --- a/arch/x86/Kconfig.cpu +++ b/arch/x86/Kconfig.cpu | |||
| @@ -406,7 +406,7 @@ config X86_CMPXCHG64 | |||
| 406 | # generates cmov. | 406 | # generates cmov. |
| 407 | config X86_CMOV | 407 | config X86_CMOV |
| 408 | def_bool y | 408 | def_bool y |
| 409 | depends on (MK8 || MK7 || MCORE2 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MATOM) | 409 | depends on (MK8 || MK7 || MCORE2 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MATOM || MGEODE_LX) |
| 410 | 410 | ||
| 411 | config X86_MINIMUM_CPU_FAMILY | 411 | config X86_MINIMUM_CPU_FAMILY |
| 412 | int | 412 | int |
diff --git a/arch/x86/Makefile_32.cpu b/arch/x86/Makefile_32.cpu index 30e9a264f69d..cbf0776dbec1 100644 --- a/arch/x86/Makefile_32.cpu +++ b/arch/x86/Makefile_32.cpu | |||
| @@ -41,7 +41,7 @@ cflags-$(CONFIG_X86_ELAN) += -march=i486 | |||
| 41 | 41 | ||
| 42 | # Geode GX1 support | 42 | # Geode GX1 support |
| 43 | cflags-$(CONFIG_MGEODEGX1) += -march=pentium-mmx | 43 | cflags-$(CONFIG_MGEODEGX1) += -march=pentium-mmx |
| 44 | 44 | cflags-$(CONFIG_MGEODE_LX) += $(call cc-option,-march=geode,-march=pentium-mmx) | |
| 45 | # add at the end to overwrite eventual tuning options from earlier | 45 | # add at the end to overwrite eventual tuning options from earlier |
| 46 | # cpu entries | 46 | # cpu entries |
| 47 | cflags-$(CONFIG_X86_GENERIC) += $(call tune,generic,$(call tune,i686)) | 47 | cflags-$(CONFIG_X86_GENERIC) += $(call tune,generic,$(call tune,i686)) |
diff --git a/arch/x86/include/asm/msr.h b/arch/x86/include/asm/msr.h index 7e2b6ba962ff..5bef931f8b14 100644 --- a/arch/x86/include/asm/msr.h +++ b/arch/x86/include/asm/msr.h | |||
| @@ -247,8 +247,8 @@ do { \ | |||
| 247 | #ifdef CONFIG_SMP | 247 | #ifdef CONFIG_SMP |
| 248 | int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h); | 248 | int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h); |
| 249 | int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h); | 249 | int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h); |
| 250 | void rdmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs); | 250 | void rdmsr_on_cpus(const struct cpumask *mask, u32 msr_no, struct msr *msrs); |
| 251 | void wrmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs); | 251 | void wrmsr_on_cpus(const struct cpumask *mask, u32 msr_no, struct msr *msrs); |
| 252 | int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h); | 252 | int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h); |
| 253 | int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h); | 253 | int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h); |
| 254 | int rdmsr_safe_regs_on_cpu(unsigned int cpu, u32 regs[8]); | 254 | int rdmsr_safe_regs_on_cpu(unsigned int cpu, u32 regs[8]); |
| @@ -264,12 +264,12 @@ static inline int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) | |||
| 264 | wrmsr(msr_no, l, h); | 264 | wrmsr(msr_no, l, h); |
| 265 | return 0; | 265 | return 0; |
| 266 | } | 266 | } |
| 267 | static inline void rdmsr_on_cpus(const cpumask_t *m, u32 msr_no, | 267 | static inline void rdmsr_on_cpus(const struct cpumask *m, u32 msr_no, |
| 268 | struct msr *msrs) | 268 | struct msr *msrs) |
| 269 | { | 269 | { |
| 270 | rdmsr_on_cpu(0, msr_no, &(msrs[0].l), &(msrs[0].h)); | 270 | rdmsr_on_cpu(0, msr_no, &(msrs[0].l), &(msrs[0].h)); |
| 271 | } | 271 | } |
| 272 | static inline void wrmsr_on_cpus(const cpumask_t *m, u32 msr_no, | 272 | static inline void wrmsr_on_cpus(const struct cpumask *m, u32 msr_no, |
| 273 | struct msr *msrs) | 273 | struct msr *msrs) |
| 274 | { | 274 | { |
| 275 | wrmsr_on_cpu(0, msr_no, msrs[0].l, msrs[0].h); | 275 | wrmsr_on_cpu(0, msr_no, msrs[0].l, msrs[0].h); |
diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c index 6a52d4b36a30..7ef24a796992 100644 --- a/arch/x86/kernel/cpuid.c +++ b/arch/x86/kernel/cpuid.c | |||
| @@ -116,21 +116,16 @@ static int cpuid_open(struct inode *inode, struct file *file) | |||
| 116 | { | 116 | { |
| 117 | unsigned int cpu; | 117 | unsigned int cpu; |
| 118 | struct cpuinfo_x86 *c; | 118 | struct cpuinfo_x86 *c; |
| 119 | int ret = 0; | ||
| 120 | |||
| 121 | lock_kernel(); | ||
| 122 | 119 | ||
| 123 | cpu = iminor(file->f_path.dentry->d_inode); | 120 | cpu = iminor(file->f_path.dentry->d_inode); |
| 124 | if (cpu >= nr_cpu_ids || !cpu_online(cpu)) { | 121 | if (cpu >= nr_cpu_ids || !cpu_online(cpu)) |
| 125 | ret = -ENXIO; /* No such CPU */ | 122 | return -ENXIO; /* No such CPU */ |
| 126 | goto out; | 123 | |
| 127 | } | ||
| 128 | c = &cpu_data(cpu); | 124 | c = &cpu_data(cpu); |
| 129 | if (c->cpuid_level < 0) | 125 | if (c->cpuid_level < 0) |
| 130 | ret = -EIO; /* CPUID not supported */ | 126 | return -EIO; /* CPUID not supported */ |
| 131 | out: | 127 | |
| 132 | unlock_kernel(); | 128 | return 0; |
| 133 | return ret; | ||
| 134 | } | 129 | } |
| 135 | 130 | ||
| 136 | /* | 131 | /* |
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index 6a3cefc7dda1..553449951b84 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
| @@ -174,21 +174,17 @@ static int msr_open(struct inode *inode, struct file *file) | |||
| 174 | { | 174 | { |
| 175 | unsigned int cpu = iminor(file->f_path.dentry->d_inode); | 175 | unsigned int cpu = iminor(file->f_path.dentry->d_inode); |
| 176 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 176 | struct cpuinfo_x86 *c = &cpu_data(cpu); |
| 177 | int ret = 0; | ||
| 178 | 177 | ||
| 179 | lock_kernel(); | ||
| 180 | cpu = iminor(file->f_path.dentry->d_inode); | 178 | cpu = iminor(file->f_path.dentry->d_inode); |
| 181 | 179 | ||
| 182 | if (cpu >= nr_cpu_ids || !cpu_online(cpu)) { | 180 | if (cpu >= nr_cpu_ids || !cpu_online(cpu)) |
| 183 | ret = -ENXIO; /* No such CPU */ | 181 | return -ENXIO; /* No such CPU */ |
| 184 | goto out; | 182 | |
| 185 | } | ||
| 186 | c = &cpu_data(cpu); | 183 | c = &cpu_data(cpu); |
| 187 | if (!cpu_has(c, X86_FEATURE_MSR)) | 184 | if (!cpu_has(c, X86_FEATURE_MSR)) |
| 188 | ret = -EIO; /* MSR not supported */ | 185 | return -EIO; /* MSR not supported */ |
| 189 | out: | 186 | |
| 190 | unlock_kernel(); | 187 | return 0; |
| 191 | return ret; | ||
| 192 | } | 188 | } |
| 193 | 189 | ||
| 194 | /* | 190 | /* |
diff --git a/arch/x86/lib/msr.c b/arch/x86/lib/msr.c index 33a1e3ca22d8..41628b104b9e 100644 --- a/arch/x86/lib/msr.c +++ b/arch/x86/lib/msr.c | |||
| @@ -71,14 +71,9 @@ int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) | |||
| 71 | } | 71 | } |
| 72 | EXPORT_SYMBOL(wrmsr_on_cpu); | 72 | EXPORT_SYMBOL(wrmsr_on_cpu); |
| 73 | 73 | ||
| 74 | /* rdmsr on a bunch of CPUs | 74 | static void __rwmsr_on_cpus(const struct cpumask *mask, u32 msr_no, |
| 75 | * | 75 | struct msr *msrs, |
| 76 | * @mask: which CPUs | 76 | void (*msr_func) (void *info)) |
| 77 | * @msr_no: which MSR | ||
| 78 | * @msrs: array of MSR values | ||
| 79 | * | ||
| 80 | */ | ||
| 81 | void rdmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs) | ||
| 82 | { | 77 | { |
| 83 | struct msr_info rv; | 78 | struct msr_info rv; |
| 84 | int this_cpu; | 79 | int this_cpu; |
| @@ -92,11 +87,23 @@ void rdmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs) | |||
| 92 | this_cpu = get_cpu(); | 87 | this_cpu = get_cpu(); |
| 93 | 88 | ||
| 94 | if (cpumask_test_cpu(this_cpu, mask)) | 89 | if (cpumask_test_cpu(this_cpu, mask)) |
| 95 | __rdmsr_on_cpu(&rv); | 90 | msr_func(&rv); |
| 96 | 91 | ||
| 97 | smp_call_function_many(mask, __rdmsr_on_cpu, &rv, 1); | 92 | smp_call_function_many(mask, msr_func, &rv, 1); |
| 98 | put_cpu(); | 93 | put_cpu(); |
| 99 | } | 94 | } |
| 95 | |||
| 96 | /* rdmsr on a bunch of CPUs | ||
| 97 | * | ||
| 98 | * @mask: which CPUs | ||
| 99 | * @msr_no: which MSR | ||
| 100 | * @msrs: array of MSR values | ||
| 101 | * | ||
| 102 | */ | ||
| 103 | void rdmsr_on_cpus(const struct cpumask *mask, u32 msr_no, struct msr *msrs) | ||
| 104 | { | ||
| 105 | __rwmsr_on_cpus(mask, msr_no, msrs, __rdmsr_on_cpu); | ||
| 106 | } | ||
| 100 | EXPORT_SYMBOL(rdmsr_on_cpus); | 107 | EXPORT_SYMBOL(rdmsr_on_cpus); |
| 101 | 108 | ||
| 102 | /* | 109 | /* |
| @@ -107,24 +114,9 @@ EXPORT_SYMBOL(rdmsr_on_cpus); | |||
| 107 | * @msrs: array of MSR values | 114 | * @msrs: array of MSR values |
| 108 | * | 115 | * |
| 109 | */ | 116 | */ |
| 110 | void wrmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs) | 117 | void wrmsr_on_cpus(const struct cpumask *mask, u32 msr_no, struct msr *msrs) |
| 111 | { | 118 | { |
| 112 | struct msr_info rv; | 119 | __rwmsr_on_cpus(mask, msr_no, msrs, __wrmsr_on_cpu); |
| 113 | int this_cpu; | ||
| 114 | |||
| 115 | memset(&rv, 0, sizeof(rv)); | ||
| 116 | |||
| 117 | rv.off = cpumask_first(mask); | ||
| 118 | rv.msrs = msrs; | ||
| 119 | rv.msr_no = msr_no; | ||
| 120 | |||
| 121 | this_cpu = get_cpu(); | ||
| 122 | |||
| 123 | if (cpumask_test_cpu(this_cpu, mask)) | ||
| 124 | __wrmsr_on_cpu(&rv); | ||
| 125 | |||
| 126 | smp_call_function_many(mask, __wrmsr_on_cpu, &rv, 1); | ||
| 127 | put_cpu(); | ||
| 128 | } | 120 | } |
| 129 | EXPORT_SYMBOL(wrmsr_on_cpus); | 121 | EXPORT_SYMBOL(wrmsr_on_cpus); |
| 130 | 122 | ||
