Commit 7a2852e49fe2d19296812c0f0f833b0ee3043bbb

Authored by Thomas Bogendoerfer
Committed by Ralf Baechle
1 parent c3dd3de789

[MIPS] IP28: switch to "normal" mode after PROM no longer needed

SGI-IP28 is running in so called slow mode, when kernel is started
from the PROM. PROM calls must be done in slow mode otherwise the
PROM will issue an error. To get better memory performance we now
switch to normal mode, when the PROM is no longer needed.

Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

Showing 2 changed files with 40 additions and 0 deletions Side-by-side Diff

arch/mips/sgi-ip22/ip22-mc.c
... ... @@ -208,5 +208,31 @@
208 208 void __init prom_meminit(void) {}
209 209 void __init prom_free_prom_memory(void)
210 210 {
  211 +#ifdef CONFIG_SGI_IP28
  212 + u32 mconfig1;
  213 + unsigned long flags;
  214 + spinlock_t lock;
  215 +
  216 + /*
  217 + * because ARCS accesses memory uncached we wait until ARCS
  218 + * isn't needed any longer, before we switch from slow to
  219 + * normal mode
  220 + */
  221 + spin_lock_irqsave(&lock, flags);
  222 + mconfig1 = sgimc->mconfig1;
  223 + /* map ECC register */
  224 + sgimc->mconfig1 = (mconfig1 & 0xffff0000) | 0x2060;
  225 + iob();
  226 + /* switch to normal mode */
  227 + *(unsigned long *)PHYS_TO_XKSEG_UNCACHED(0x60000000) = 0;
  228 + iob();
  229 + /* reduce WR_COL */
  230 + sgimc->cmacc = (sgimc->cmacc & ~0xf) | 4;
  231 + iob();
  232 + /* restore old config */
  233 + sgimc->mconfig1 = mconfig1;
  234 + iob();
  235 + spin_unlock_irqrestore(&lock, flags);
  236 +#endif
211 237 }
include/asm-mips/barrier.h
... ... @@ -92,11 +92,25 @@
92 92 #define fast_wmb() __sync()
93 93 #define fast_rmb() __sync()
94 94 #define fast_mb() __sync()
  95 +#ifdef CONFIG_SGI_IP28
95 96 #define fast_iob() \
  97 + __asm__ __volatile__( \
  98 + ".set push\n\t" \
  99 + ".set noreorder\n\t" \
  100 + "lw $0,%0\n\t" \
  101 + "sync\n\t" \
  102 + "lw $0,%0\n\t" \
  103 + ".set pop" \
  104 + : /* no output */ \
  105 + : "m" (*(int *)CKSEG1ADDR(0x1fa00004)) \
  106 + : "memory")
  107 +#else
  108 +#define fast_iob() \
96 109 do { \
97 110 __sync(); \
98 111 __fast_iob(); \
99 112 } while (0)
  113 +#endif
100 114  
101 115 #ifdef CONFIG_CPU_HAS_WB
102 116