Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

MIPS: BMIPS: Fix compilation for BMIPS5000

Commit 02b849f7613003fe5f9e58bf233d49b0ebd4a5e8 ("MIPS: Get rid of the
use of .macro in C code.") replaced the macro usage but missed
the accessors in bmips.h, causing the following build error:

CC arch/mips/kernel/smp-bmips.o
{standard input}: Assembler messages:
{standard input}:951: Error: Unrecognized opcode `_ssnop'
{standard input}:952: Error: Unrecognized opcode `_ssnop'
(...)
make[6]: *** [arch/mips/kernel/smp-bmips.o] Error 1

Fix by rewriting the inline assembler using existing inline functions.
The generated code should stay unchanged.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Patchwork: https://patchwork.linux-mips.org/patch/5644/
Reviewed-by: Jonas Gorski <jogo@openwrt.org>

+22 -33
+22 -33
arch/mips/include/asm/bmips.h
··· 65 65 { 66 66 unsigned long ret; 67 67 68 - __asm__ __volatile__( 69 - ".set push\n" 70 - ".set noreorder\n" 71 - "cache %1, 0(%2)\n" 72 - "sync\n" 73 - "_ssnop\n" 74 - "_ssnop\n" 75 - "_ssnop\n" 76 - "_ssnop\n" 77 - "_ssnop\n" 78 - "_ssnop\n" 79 - "_ssnop\n" 80 - "mfc0 %0, $28, 3\n" 81 - "_ssnop\n" 82 - ".set pop\n" 83 - : "=&r" (ret) 84 - : "i" (Index_Load_Tag_S), "r" (ZSCM_REG_BASE + offset) 85 - : "memory"); 68 + barrier(); 69 + cache_op(Index_Load_Tag_S, ZSCM_REG_BASE + offset); 70 + __sync(); 71 + _ssnop(); 72 + _ssnop(); 73 + _ssnop(); 74 + _ssnop(); 75 + _ssnop(); 76 + _ssnop(); 77 + _ssnop(); 78 + ret = read_c0_ddatalo(); 79 + _ssnop(); 80 + 86 81 return ret; 87 82 } 88 83 89 84 static inline void bmips_write_zscm_reg(unsigned int offset, unsigned long data) 90 85 { 91 - __asm__ __volatile__( 92 - ".set push\n" 93 - ".set noreorder\n" 94 - "mtc0 %0, $28, 3\n" 95 - "_ssnop\n" 96 - "_ssnop\n" 97 - "_ssnop\n" 98 - "cache %1, 0(%2)\n" 99 - "_ssnop\n" 100 - "_ssnop\n" 101 - "_ssnop\n" 102 - : /* no outputs */ 103 - : "r" (data), 104 - "i" (Index_Store_Tag_S), "r" (ZSCM_REG_BASE + offset) 105 - : "memory"); 86 + write_c0_ddatalo(data); 87 + _ssnop(); 88 + _ssnop(); 89 + _ssnop(); 90 + cache_op(Index_Store_Tag_S, ZSCM_REG_BASE + offset); 91 + _ssnop(); 92 + _ssnop(); 93 + _ssnop(); 94 + barrier(); 106 95 } 107 96 108 97 #endif /* !defined(__ASSEMBLY__) */