forked from torvalds/linux
-
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.
MIPS: Outline udelay and fix a few issues.
Outlining fixes the issue were on certain CPUs such as the R10000 family the delay loop would need an extra cycle if it overlaps a cacheline boundary. The rewrite also fixes build errors with GCC 4.4 which was changed in way incompatible with the kernel's inline assembly. Relying on pure C for computation of the delay value removes the need for explicit. The price we pay is a slight slowdown of the computation - to be fixed on another day. Signed-off-by: Ralf Baechle <[email protected]>
- Loading branch information
1 parent
3a55314
commit 5636919
Showing
5 changed files
with
66 additions
and
92 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 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
* | ||
* Copyright (C) 1994 by Waldorf Electronics | ||
* Copyright (C) 1995 - 2000, 01, 03 by Ralf Baechle | ||
* Copyright (C) 1999, 2000 Silicon Graphics, Inc. | ||
* Copyright (C) 2007 Maciej W. Rozycki | ||
*/ | ||
#include <linux/module.h> | ||
#include <linux/param.h> | ||
#include <linux/smp.h> | ||
|
||
#include <asm/compiler.h> | ||
#include <asm/war.h> | ||
|
||
inline void __delay(unsigned int loops) | ||
{ | ||
__asm__ __volatile__ ( | ||
" .set noreorder \n" | ||
" .align 3 \n" | ||
"1: bnez %0, 1b \n" | ||
" subu %0, 1 \n" | ||
" .set reorder \n" | ||
: "=r" (loops) | ||
: "0" (loops)); | ||
} | ||
EXPORT_SYMBOL(__delay); | ||
|
||
/* | ||
* Division by multiplication: you don't have to worry about | ||
* loss of precision. | ||
* | ||
* Use only for very small delays ( < 1 msec). Should probably use a | ||
* lookup table, really, as the multiplications take much too long with | ||
* short delays. This is a "reasonable" implementation, though (and the | ||
* first constant multiplications gets optimized away if the delay is | ||
* a constant) | ||
*/ | ||
|
||
void __udelay(unsigned long us) | ||
{ | ||
unsigned int lpj = current_cpu_data.udelay_val; | ||
|
||
__delay((us * 0x000010c7 * HZ * lpj) >> 32); | ||
} | ||
EXPORT_SYMBOL(__udelay); | ||
|
||
void __ndelay(unsigned long ns) | ||
{ | ||
unsigned int lpj = current_cpu_data.udelay_val; | ||
|
||
__delay((us * 0x00000005 * HZ * lpj) >> 32); | ||
} | ||
EXPORT_SYMBOL(__ndelay); |