diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2013-09-12 07:47:32 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2013-09-18 10:31:49 -0400 |
commit | 9c9b415c50bc298ac61412dff856eae2f54889ee (patch) | |
tree | b2fd1afaf7740202cd99d37ff0084dcd87674e46 /arch/mips | |
parent | 69f24d1784b631b81a54eb57c49bf46536dd2382 (diff) |
MIPS: Reimplement get_cycles().
This essentially reverts commit efb9ca08b5a2374b29938cdcab417ce4feb14b54
(kernel.org) / 58020a106879a8b372068741c81f0015c9b0b96dbv [[MIPS] Change
get_cycles to always return 0.]
Most users of get_cycles() invoke it as a timing interface. That's why
in modern kernels it was never very much missed for. /dev/random however
uses get_cycles() in the how the jitter in the interrupt timing contains
some useful entropy.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips')
-rw-r--r-- | arch/mips/include/asm/timex.h | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/arch/mips/include/asm/timex.h b/arch/mips/include/asm/timex.h index 6529704aa73a..c5424757da65 100644 --- a/arch/mips/include/asm/timex.h +++ b/arch/mips/include/asm/timex.h | |||
@@ -10,7 +10,9 @@ | |||
10 | 10 | ||
11 | #ifdef __KERNEL__ | 11 | #ifdef __KERNEL__ |
12 | 12 | ||
13 | #include <asm/cpu-features.h> | ||
13 | #include <asm/mipsregs.h> | 14 | #include <asm/mipsregs.h> |
15 | #include <asm/cpu-type.h> | ||
14 | 16 | ||
15 | /* | 17 | /* |
16 | * This is the clock rate of the i8253 PIT. A MIPS system may not have | 18 | * This is the clock rate of the i8253 PIT. A MIPS system may not have |
@@ -33,9 +35,38 @@ | |||
33 | 35 | ||
34 | typedef unsigned int cycles_t; | 36 | typedef unsigned int cycles_t; |
35 | 37 | ||
38 | /* | ||
39 | * On R4000/R4400 before version 5.0 an erratum exists such that if the | ||
40 | * cycle counter is read in the exact moment that it is matching the | ||
41 | * compare register, no interrupt will be generated. | ||
42 | * | ||
43 | * There is a suggested workaround and also the erratum can't strike if | ||
44 | * the compare interrupt isn't being used as the clock source device. | ||
45 | * However for now the implementaton of this function doesn't get these | ||
46 | * fine details right. | ||
47 | */ | ||
36 | static inline cycles_t get_cycles(void) | 48 | static inline cycles_t get_cycles(void) |
37 | { | 49 | { |
38 | return 0; | 50 | switch (boot_cpu_type()) { |
51 | case CPU_R4400PC: | ||
52 | case CPU_R4400SC: | ||
53 | case CPU_R4400MC: | ||
54 | if ((read_c0_prid() & 0xff) >= 0x0050) | ||
55 | return read_c0_count(); | ||
56 | break; | ||
57 | |||
58 | case CPU_R4000PC: | ||
59 | case CPU_R4000SC: | ||
60 | case CPU_R4000MC: | ||
61 | break; | ||
62 | |||
63 | default: | ||
64 | if (cpu_has_counter) | ||
65 | return read_c0_count(); | ||
66 | break; | ||
67 | } | ||
68 | |||
69 | return 0; /* no usable counter */ | ||
39 | } | 70 | } |
40 | 71 | ||
41 | #endif /* __KERNEL__ */ | 72 | #endif /* __KERNEL__ */ |