OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [x86/] [lib/] [msr-on-cpu.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
#include <linux/module.h>
2
#include <linux/preempt.h>
3
#include <linux/smp.h>
4
#include <asm/msr.h>
5
 
6
struct msr_info {
7
        u32 msr_no;
8
        u32 l, h;
9
        int err;
10
};
11
 
12
static void __rdmsr_on_cpu(void *info)
13
{
14
        struct msr_info *rv = info;
15
 
16
        rdmsr(rv->msr_no, rv->l, rv->h);
17
}
18
 
19
static void __rdmsr_safe_on_cpu(void *info)
20
{
21
        struct msr_info *rv = info;
22
 
23
        rv->err = rdmsr_safe(rv->msr_no, &rv->l, &rv->h);
24
}
25
 
26
static int _rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h, int safe)
27
{
28
        int err = 0;
29
        struct msr_info rv;
30
 
31
        rv.msr_no = msr_no;
32
        if (safe) {
33
                smp_call_function_single(cpu, __rdmsr_safe_on_cpu, &rv, 0, 1);
34
                err = rv.err;
35
        } else {
36
                smp_call_function_single(cpu, __rdmsr_on_cpu, &rv, 0, 1);
37
        }
38
        *l = rv.l;
39
        *h = rv.h;
40
 
41
        return err;
42
}
43
 
44
static void __wrmsr_on_cpu(void *info)
45
{
46
        struct msr_info *rv = info;
47
 
48
        wrmsr(rv->msr_no, rv->l, rv->h);
49
}
50
 
51
static void __wrmsr_safe_on_cpu(void *info)
52
{
53
        struct msr_info *rv = info;
54
 
55
        rv->err = wrmsr_safe(rv->msr_no, rv->l, rv->h);
56
}
57
 
58
static int _wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h, int safe)
59
{
60
        int err = 0;
61
        struct msr_info rv;
62
 
63
        rv.msr_no = msr_no;
64
        rv.l = l;
65
        rv.h = h;
66
        if (safe) {
67
                smp_call_function_single(cpu, __wrmsr_safe_on_cpu, &rv, 0, 1);
68
                err = rv.err;
69
        } else {
70
                smp_call_function_single(cpu, __wrmsr_on_cpu, &rv, 0, 1);
71
        }
72
 
73
        return err;
74
}
75
 
76
void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
77
{
78
        _wrmsr_on_cpu(cpu, msr_no, l, h, 0);
79
}
80
 
81
void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
82
{
83
        _rdmsr_on_cpu(cpu, msr_no, l, h, 0);
84
}
85
 
86
/* These "safe" variants are slower and should be used when the target MSR
87
   may not actually exist. */
88
int wrmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
89
{
90
        return _wrmsr_on_cpu(cpu, msr_no, l, h, 1);
91
}
92
 
93
int rdmsr_safe_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h)
94
{
95
        return _rdmsr_on_cpu(cpu, msr_no, l, h, 1);
96
}
97
 
98
EXPORT_SYMBOL(rdmsr_on_cpu);
99
EXPORT_SYMBOL(wrmsr_on_cpu);
100
EXPORT_SYMBOL(rdmsr_safe_on_cpu);
101
EXPORT_SYMBOL(wrmsr_safe_on_cpu);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.