-
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.
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel…
…/git/bp/bp * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp: (26 commits) amd64_edac: add MAINTAINERS entry EDAC: do not enable modules by default amd64_edac: do not enable module by default amd64_edac: add module registration routines amd64_edac: add ECC reporting initializers amd64_edac: add EDAC core-related initializers amd64_edac: add error decoding logic amd64_edac: add ECC chipkill syndrome mapping table amd64_edac: add per-family descriptors amd64_edac: add F10h-and-later methods-p3 amd64_edac: add F10h-and-later methods-p2 amd64_edac: add F10h-and-later methods-p1 amd64_edac: add k8-specific methods amd64_edac: assign DRAM chip select base and mask in a family-specific way amd64_edac: add helper to dump relevant registers amd64_edac: add DRAM address type conversion facilities amd64_edac: add functionality to compute the DRAM hole amd64_edac: add sys addr to memory controller mapping helpers amd64_edac: add memory scrubber interface amd64_edac: add MCA error types ...
- Loading branch information
Showing
13 changed files
with
4,853 additions
and
103 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
This file was deleted.
Oops, something went wrong.
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,183 @@ | ||
#include <linux/module.h> | ||
#include <linux/preempt.h> | ||
#include <linux/smp.h> | ||
#include <asm/msr.h> | ||
|
||
struct msr_info { | ||
u32 msr_no; | ||
struct msr reg; | ||
struct msr *msrs; | ||
int off; | ||
int err; | ||
}; | ||
|
||
static void __rdmsr_on_cpu(void *info) | ||
{ | ||
struct msr_info *rv = info; | ||
struct msr *reg; | ||
int this_cpu = raw_smp_processor_id(); | ||
|
||
if (rv->msrs) | ||
reg = &rv->msrs[this_cpu - rv->off]; | ||
else | ||
reg = &rv->reg; | ||
|
||
rdmsr(rv->msr_no, reg->l, reg->h); | ||
} | ||
|
||
static void __wrmsr_on_cpu(void *info) | ||
{ | ||
struct msr_info *rv = info; | ||
struct msr *reg; | ||
int this_cpu = raw_smp_processor_id(); | ||
|
||
if (rv->msrs) | ||
reg = &rv->msrs[this_cpu - rv->off]; | ||
else | ||
reg = &rv->reg; | ||
|
||
wrmsr(rv->msr_no, reg->l, reg->h); | ||
} | ||
|
||
int rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h) | ||
{ | ||
int err; | ||
struct msr_info rv; | ||
|
||
memset(&rv, 0, sizeof(rv)); | ||
|
||
rv.msr_no = msr_no; | ||
err = smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 1); | ||
*l = rv.reg.l; | ||
*h = rv.reg.h; | ||
|
||
return err; | ||
} | ||
EXPORT_SYMBOL(rdmsr_on_cpu); | ||
|
||
int wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) | ||
{ | ||
int err; | ||
struct msr_info rv; | ||
|
||
memset(&rv, 0, sizeof(rv)); | ||
|
||
rv.msr_no = msr_no; | ||
rv.reg.l = l; | ||
rv.reg.h = h; | ||
err = smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 1); | ||
|
||
return err; | ||
} | ||
EXPORT_SYMBOL(wrmsr_on_cpu); | ||
|
||
/* rdmsr on a bunch of CPUs | ||
* | ||
* @mask: which CPUs | ||
* @msr_no: which MSR | ||
* @msrs: array of MSR values | ||
* | ||
*/ | ||
void rdmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs) | ||
{ | ||
struct msr_info rv; | ||
int this_cpu; | ||
|
||
memset(&rv, 0, sizeof(rv)); | ||
|
||
rv.off = cpumask_first(mask); | ||
rv.msrs = msrs; | ||
rv.msr_no = msr_no; | ||
|
||
preempt_disable(); | ||
/* | ||
* FIXME: handle the CPU we're executing on separately for now until | ||
* smp_call_function_many has been fixed to not skip it. | ||
*/ | ||
this_cpu = raw_smp_processor_id(); | ||
smp_call_function_single(this_cpu, __rdmsr_on_cpu, &rv, 1); | ||
|
||
smp_call_function_many(mask, __rdmsr_on_cpu, &rv, 1); | ||
preempt_enable(); | ||
} | ||
EXPORT_SYMBOL(rdmsr_on_cpus); | ||
|
||
/* | ||
* wrmsr on a bunch of CPUs | ||
* | ||
* @mask: which CPUs | ||
* @msr_no: which MSR | ||
* @msrs: array of MSR values | ||
* | ||
*/ | ||
void wrmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs) | ||
{ | ||
struct msr_info rv; | ||
int this_cpu; | ||
|
||
memset(&rv, 0, sizeof(rv)); | ||
|
||
rv.off = cpumask_first(mask); | ||
rv.msrs = msrs; | ||
rv.msr_no = msr_no; | ||
|
||
preempt_disable(); | ||
/* | ||
* FIXME: handle the CPU we're executing on separately for now until | ||
* smp_call_function_many has been fixed to not skip it. | ||
*/ | ||
this_cpu = raw_smp_processor_id(); | ||
smp_call_function_single(this_cpu, __wrmsr_on_cpu, &rv, 1); | ||
|
||
smp_call_function_many(mask, __wrmsr_on_cpu, &rv, 1); | ||
preempt_enable(); | ||
} | ||
EXPORT_SYMBOL(wrmsr_on_cpus); | ||
|
||
/* These "safe" variants are slower and should be used when the target MSR | ||
may not actually exist. */ | ||
static void __rdmsr_safe_on_cpu(void *info) | ||
{ | ||
struct msr_info *rv = info; | ||
|
||
rv->err = rdmsr_safe(rv->msr_no, &rv->reg.l, &rv->reg.h); | ||
} | ||
|
||
static void __wrmsr_safe_on_cpu(void *info) | ||
{ | ||
struct msr_info *rv = info; | ||
|
||
rv->err = wrmsr_safe(rv->msr_no, rv->reg.l, rv->reg.h); | ||
} | ||
|
||
int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h) | ||
{ | ||
int err; | ||
struct msr_info rv; | ||
|
||
memset(&rv, 0, sizeof(rv)); | ||
|
||
rv.msr_no = msr_no; | ||
err = smp_call_function_single(cpu, __rdmsr_safe_on_cpu, &rv, 1); | ||
*l = rv.reg.l; | ||
*h = rv.reg.h; | ||
|
||
return err ? err : rv.err; | ||
} | ||
EXPORT_SYMBOL(rdmsr_safe_on_cpu); | ||
|
||
int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h) | ||
{ | ||
int err; | ||
struct msr_info rv; | ||
|
||
memset(&rv, 0, sizeof(rv)); | ||
|
||
rv.msr_no = msr_no; | ||
rv.reg.l = l; | ||
rv.reg.h = h; | ||
err = smp_call_function_single(cpu, __wrmsr_safe_on_cpu, &rv, 1); | ||
|
||
return err ? err : rv.err; | ||
} | ||
EXPORT_SYMBOL(wrmsr_safe_on_cpu); |
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
Oops, something went wrong.