Commit be75de25 authored by Max Filippov's avatar Max Filippov

xtensa: limit offsets in __loop_cache_{all,page}

When building kernel for xtensa cores with big cache lines (e.g. 128
bytes or more) __loop_cache_all and __loop_cache_page may generate
assembly instructions with immediate fields that are too big. This
results in the following build errors:

  arch/xtensa/mm/misc.S: Assembler messages:
  arch/xtensa/mm/misc.S:464: Error: operand 2 of 'diwbi' has invalid value '256'
  arch/xtensa/mm/misc.S:464: Error: operand 2 of 'diwbi' has invalid value '384'
  arch/xtensa/kernel/head.S: Assembler messages:
  arch/xtensa/kernel/head.S:172: Error: operand 2 of 'diu' has invalid value '256'
  arch/xtensa/kernel/head.S:172: Error: operand 2 of 'diu' has invalid value '384'
  arch/xtensa/kernel/head.S:176: Error: operand 2 of 'iiu' has invalid value '256'
  arch/xtensa/kernel/head.S:176: Error: operand 2 of 'iiu' has invalid value '384'
  arch/xtensa/kernel/head.S:255: Error: operand 2 of 'diwb' has invalid value '256'
  arch/xtensa/kernel/head.S:255: Error: operand 2 of 'diwb' has invalid value '384'

Add parameter max_immed to these macros and use it to limit values of
immediate operands. Extract common code of these macros into the new
macro __loop_cache_unroll.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 1ffaddd0
...@@ -31,16 +31,32 @@ ...@@ -31,16 +31,32 @@
* *
*/ */
.macro __loop_cache_all ar at insn size line_width
movi \ar, 0 .macro __loop_cache_unroll ar at insn size line_width max_immed
.if (1 << (\line_width)) > (\max_immed)
.set _reps, 1
.elseif (2 << (\line_width)) > (\max_immed)
.set _reps, 2
.else
.set _reps, 4
.endif
__loopi \ar, \at, \size, (_reps << (\line_width))
.set _index, 0
.rep _reps
\insn \ar, _index << (\line_width)
.set _index, _index + 1
.endr
__endla \ar, \at, _reps << (\line_width)
.endm
__loopi \ar, \at, \size, (4 << (\line_width)) .macro __loop_cache_all ar at insn size line_width max_immed
\insn \ar, 0 << (\line_width)
\insn \ar, 1 << (\line_width) movi \ar, 0
\insn \ar, 2 << (\line_width) __loop_cache_unroll \ar, \at, \insn, \size, \line_width, \max_immed
\insn \ar, 3 << (\line_width)
__endla \ar, \at, 4 << (\line_width)
.endm .endm
...@@ -57,14 +73,9 @@ ...@@ -57,14 +73,9 @@
.endm .endm
.macro __loop_cache_page ar at insn line_width .macro __loop_cache_page ar at insn line_width max_immed
__loopi \ar, \at, PAGE_SIZE, 4 << (\line_width) __loop_cache_unroll \ar, \at, \insn, PAGE_SIZE, \line_width, \max_immed
\insn \ar, 0 << (\line_width)
\insn \ar, 1 << (\line_width)
\insn \ar, 2 << (\line_width)
\insn \ar, 3 << (\line_width)
__endla \ar, \at, 4 << (\line_width)
.endm .endm
...@@ -72,7 +83,8 @@ ...@@ -72,7 +83,8 @@
.macro ___unlock_dcache_all ar at .macro ___unlock_dcache_all ar at
#if XCHAL_DCACHE_LINE_LOCKABLE && XCHAL_DCACHE_SIZE #if XCHAL_DCACHE_LINE_LOCKABLE && XCHAL_DCACHE_SIZE
__loop_cache_all \ar \at diu XCHAL_DCACHE_SIZE XCHAL_DCACHE_LINEWIDTH __loop_cache_all \ar \at diu XCHAL_DCACHE_SIZE \
XCHAL_DCACHE_LINEWIDTH 240
#endif #endif
.endm .endm
...@@ -81,7 +93,8 @@ ...@@ -81,7 +93,8 @@
.macro ___unlock_icache_all ar at .macro ___unlock_icache_all ar at
#if XCHAL_ICACHE_LINE_LOCKABLE && XCHAL_ICACHE_SIZE #if XCHAL_ICACHE_LINE_LOCKABLE && XCHAL_ICACHE_SIZE
__loop_cache_all \ar \at iiu XCHAL_ICACHE_SIZE XCHAL_ICACHE_LINEWIDTH __loop_cache_all \ar \at iiu XCHAL_ICACHE_SIZE \
XCHAL_ICACHE_LINEWIDTH 240
#endif #endif
.endm .endm
...@@ -90,7 +103,8 @@ ...@@ -90,7 +103,8 @@
.macro ___flush_invalidate_dcache_all ar at .macro ___flush_invalidate_dcache_all ar at
#if XCHAL_DCACHE_SIZE #if XCHAL_DCACHE_SIZE
__loop_cache_all \ar \at diwbi XCHAL_DCACHE_SIZE XCHAL_DCACHE_LINEWIDTH __loop_cache_all \ar \at diwbi XCHAL_DCACHE_SIZE \
XCHAL_DCACHE_LINEWIDTH 240
#endif #endif
.endm .endm
...@@ -99,7 +113,8 @@ ...@@ -99,7 +113,8 @@
.macro ___flush_dcache_all ar at .macro ___flush_dcache_all ar at
#if XCHAL_DCACHE_SIZE #if XCHAL_DCACHE_SIZE
__loop_cache_all \ar \at diwb XCHAL_DCACHE_SIZE XCHAL_DCACHE_LINEWIDTH __loop_cache_all \ar \at diwb XCHAL_DCACHE_SIZE \
XCHAL_DCACHE_LINEWIDTH 240
#endif #endif
.endm .endm
...@@ -109,7 +124,7 @@ ...@@ -109,7 +124,7 @@
#if XCHAL_DCACHE_SIZE #if XCHAL_DCACHE_SIZE
__loop_cache_all \ar \at dii __stringify(DCACHE_WAY_SIZE) \ __loop_cache_all \ar \at dii __stringify(DCACHE_WAY_SIZE) \
XCHAL_DCACHE_LINEWIDTH XCHAL_DCACHE_LINEWIDTH 1020
#endif #endif
.endm .endm
...@@ -119,7 +134,7 @@ ...@@ -119,7 +134,7 @@
#if XCHAL_ICACHE_SIZE #if XCHAL_ICACHE_SIZE
__loop_cache_all \ar \at iii __stringify(ICACHE_WAY_SIZE) \ __loop_cache_all \ar \at iii __stringify(ICACHE_WAY_SIZE) \
XCHAL_ICACHE_LINEWIDTH XCHAL_ICACHE_LINEWIDTH 1020
#endif #endif
.endm .endm
...@@ -166,7 +181,7 @@ ...@@ -166,7 +181,7 @@
.macro ___flush_invalidate_dcache_page ar as .macro ___flush_invalidate_dcache_page ar as
#if XCHAL_DCACHE_SIZE #if XCHAL_DCACHE_SIZE
__loop_cache_page \ar \as dhwbi XCHAL_DCACHE_LINEWIDTH __loop_cache_page \ar \as dhwbi XCHAL_DCACHE_LINEWIDTH 1020
#endif #endif
.endm .endm
...@@ -175,7 +190,7 @@ ...@@ -175,7 +190,7 @@
.macro ___flush_dcache_page ar as .macro ___flush_dcache_page ar as
#if XCHAL_DCACHE_SIZE #if XCHAL_DCACHE_SIZE
__loop_cache_page \ar \as dhwb XCHAL_DCACHE_LINEWIDTH __loop_cache_page \ar \as dhwb XCHAL_DCACHE_LINEWIDTH 1020
#endif #endif
.endm .endm
...@@ -184,7 +199,7 @@ ...@@ -184,7 +199,7 @@
.macro ___invalidate_dcache_page ar as .macro ___invalidate_dcache_page ar as
#if XCHAL_DCACHE_SIZE #if XCHAL_DCACHE_SIZE
__loop_cache_page \ar \as dhi XCHAL_DCACHE_LINEWIDTH __loop_cache_page \ar \as dhi XCHAL_DCACHE_LINEWIDTH 1020
#endif #endif
.endm .endm
...@@ -193,7 +208,7 @@ ...@@ -193,7 +208,7 @@
.macro ___invalidate_icache_page ar as .macro ___invalidate_icache_page ar as
#if XCHAL_ICACHE_SIZE #if XCHAL_ICACHE_SIZE
__loop_cache_page \ar \as ihi XCHAL_ICACHE_LINEWIDTH __loop_cache_page \ar \as ihi XCHAL_ICACHE_LINEWIDTH 1020
#endif #endif
.endm .endm
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment