Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 62199
b: refs/heads/master
c: 5a81299
h: refs/heads/master
i:
  62197: 64a0955
  62195: 61b59ac
  62191: fab9718
v: v3
  • Loading branch information
Ralf Baechle committed Jul 20, 2007
1 parent e5707e2 commit c58655e
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 17099b1142f6c0359fca60a3464dea8fb30badea
refs/heads/master: 5a81299928f3d9abfaced60bedd85214cf9921a4
26 changes: 25 additions & 1 deletion trunk/arch/mips/kernel/cpu-probe.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,27 @@ static void r4k_wait_irqoff(void)
local_irq_enable();
}

/*
* The RM7000 variant has to handle erratum 38. The workaround is to not
* have any pending stores when the WAIT instruction is executed.
*/
static void rm7k_wait_irqoff(void)
{
local_irq_disable();
if (!need_resched())
__asm__(
" .set push \n"
" .set mips3 \n"
" .set noat \n"
" mfc0 $1, $12 \n"
" sync \n"
" mtc0 $1, $12 # stalls until W stage \n"
" wait \n"
" mtc0 $1, $12 # stalls until W stage \n"
" .set pop \n");
local_irq_enable();
}

/* The Au1xxx wait is available only if using 32khz counter or
* external timer source, but specifically not CP0 Counter. */
int allow_au1k_wait;
Expand Down Expand Up @@ -132,7 +153,6 @@ static inline void check_wait(void)
case CPU_R4700:
case CPU_R5000:
case CPU_NEVADA:
case CPU_RM7000:
case CPU_4KC:
case CPU_4KEC:
case CPU_4KSC:
Expand All @@ -142,6 +162,10 @@ static inline void check_wait(void)
cpu_wait = r4k_wait;
break;

case CPU_RM7000:
cpu_wait = rm7k_wait_irqoff;
break;

case CPU_24K:
case CPU_34K:
cpu_wait = r4k_wait;
Expand Down

0 comments on commit c58655e

Please sign in to comment.