diff options
author | Markos Chandras <markos.chandras@imgtec.com> | 2014-11-13 08:25:51 -0500 |
---|---|---|
committer | Markos Chandras <markos.chandras@imgtec.com> | 2015-02-17 10:37:20 -0500 |
commit | 934c79231c1b3a88ed1ef8f1473fb26849ae501c (patch) | |
tree | 236efbdff02a3033cc90e8308e7cbb87821e8f23 /arch | |
parent | 8716a7635665008291d3f19dd5d36a858ed1561b (diff) |
MIPS: asm: r4kcache: Add MIPS R6 cache unroll functions
MIPS R6 changed the 'cache' instruction opcode and reduced the
offset field to 8 bits. This means we now have to adjust the
base register every 256 bytes and as a result of which we can
no longer use the previous cache functions.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/mips/include/asm/r4kcache.h | 150 |
1 files changed, 148 insertions, 2 deletions
diff --git a/arch/mips/include/asm/r4kcache.h b/arch/mips/include/asm/r4kcache.h index e293a8d89a6d..1b22d2da88a1 100644 --- a/arch/mips/include/asm/r4kcache.h +++ b/arch/mips/include/asm/r4kcache.h | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | #include <asm/asm.h> | 15 | #include <asm/asm.h> |
16 | #include <asm/cacheops.h> | 16 | #include <asm/cacheops.h> |
17 | #include <asm/compiler.h> | ||
17 | #include <asm/cpu-features.h> | 18 | #include <asm/cpu-features.h> |
18 | #include <asm/cpu-type.h> | 19 | #include <asm/cpu-type.h> |
19 | #include <asm/mipsmtregs.h> | 20 | #include <asm/mipsmtregs.h> |
@@ -39,7 +40,7 @@ extern void (*r4k_blast_icache)(void); | |||
39 | __asm__ __volatile__( \ | 40 | __asm__ __volatile__( \ |
40 | " .set push \n" \ | 41 | " .set push \n" \ |
41 | " .set noreorder \n" \ | 42 | " .set noreorder \n" \ |
42 | " .set arch=r4000 \n" \ | 43 | " .set "MIPS_ISA_ARCH_LEVEL" \n" \ |
43 | " cache %0, %1 \n" \ | 44 | " cache %0, %1 \n" \ |
44 | " .set pop \n" \ | 45 | " .set pop \n" \ |
45 | : \ | 46 | : \ |
@@ -147,7 +148,7 @@ static inline void flush_scache_line(unsigned long addr) | |||
147 | __asm__ __volatile__( \ | 148 | __asm__ __volatile__( \ |
148 | " .set push \n" \ | 149 | " .set push \n" \ |
149 | " .set noreorder \n" \ | 150 | " .set noreorder \n" \ |
150 | " .set arch=r4000 \n" \ | 151 | " .set "MIPS_ISA_ARCH_LEVEL" \n" \ |
151 | "1: cache %0, (%1) \n" \ | 152 | "1: cache %0, (%1) \n" \ |
152 | "2: .set pop \n" \ | 153 | "2: .set pop \n" \ |
153 | " .section __ex_table,\"a\" \n" \ | 154 | " .section __ex_table,\"a\" \n" \ |
@@ -218,6 +219,7 @@ static inline void invalidate_tcache_page(unsigned long addr) | |||
218 | cache_op(Page_Invalidate_T, addr); | 219 | cache_op(Page_Invalidate_T, addr); |
219 | } | 220 | } |
220 | 221 | ||
222 | #ifndef CONFIG_CPU_MIPSR6 | ||
221 | #define cache16_unroll32(base,op) \ | 223 | #define cache16_unroll32(base,op) \ |
222 | __asm__ __volatile__( \ | 224 | __asm__ __volatile__( \ |
223 | " .set push \n" \ | 225 | " .set push \n" \ |
@@ -322,6 +324,150 @@ static inline void invalidate_tcache_page(unsigned long addr) | |||
322 | : "r" (base), \ | 324 | : "r" (base), \ |
323 | "i" (op)); | 325 | "i" (op)); |
324 | 326 | ||
327 | #else | ||
328 | /* | ||
329 | * MIPS R6 changed the cache opcode and moved to a 8-bit offset field. | ||
330 | * This means we now need to increment the base register before we flush | ||
331 | * more cache lines | ||
332 | */ | ||
333 | #define cache16_unroll32(base,op) \ | ||
334 | __asm__ __volatile__( \ | ||
335 | " .set push\n" \ | ||
336 | " .set noreorder\n" \ | ||
337 | " .set mips64r6\n" \ | ||
338 | " .set noat\n" \ | ||
339 | " cache %1, 0x000(%0); cache %1, 0x010(%0)\n" \ | ||
340 | " cache %1, 0x020(%0); cache %1, 0x030(%0)\n" \ | ||
341 | " cache %1, 0x040(%0); cache %1, 0x050(%0)\n" \ | ||
342 | " cache %1, 0x060(%0); cache %1, 0x070(%0)\n" \ | ||
343 | " cache %1, 0x080(%0); cache %1, 0x090(%0)\n" \ | ||
344 | " cache %1, 0x0a0(%0); cache %1, 0x0b0(%0)\n" \ | ||
345 | " cache %1, 0x0c0(%0); cache %1, 0x0d0(%0)\n" \ | ||
346 | " cache %1, 0x0e0(%0); cache %1, 0x0f0(%0)\n" \ | ||
347 | " addiu $1, $0, 0x100 \n" \ | ||
348 | " cache %1, 0x000($1); cache %1, 0x010($1)\n" \ | ||
349 | " cache %1, 0x020($1); cache %1, 0x030($1)\n" \ | ||
350 | " cache %1, 0x040($1); cache %1, 0x050($1)\n" \ | ||
351 | " cache %1, 0x060($1); cache %1, 0x070($1)\n" \ | ||
352 | " cache %1, 0x080($1); cache %1, 0x090($1)\n" \ | ||
353 | " cache %1, 0x0a0($1); cache %1, 0x0b0($1)\n" \ | ||
354 | " cache %1, 0x0c0($1); cache %1, 0x0d0($1)\n" \ | ||
355 | " cache %1, 0x0e0($1); cache %1, 0x0f0($1)\n" \ | ||
356 | " .set pop\n" \ | ||
357 | : \ | ||
358 | : "r" (base), \ | ||
359 | "i" (op)); | ||
360 | |||
361 | #define cache32_unroll32(base,op) \ | ||
362 | __asm__ __volatile__( \ | ||
363 | " .set push\n" \ | ||
364 | " .set noreorder\n" \ | ||
365 | " .set mips64r6\n" \ | ||
366 | " .set noat\n" \ | ||
367 | " cache %1, 0x000(%0); cache %1, 0x020(%0)\n" \ | ||
368 | " cache %1, 0x040(%0); cache %1, 0x060(%0)\n" \ | ||
369 | " cache %1, 0x080(%0); cache %1, 0x0a0(%0)\n" \ | ||
370 | " cache %1, 0x0c0(%0); cache %1, 0x0e0(%0)\n" \ | ||
371 | " addiu $1, %0, 0x100\n" \ | ||
372 | " cache %1, 0x000($1); cache %1, 0x020($1)\n" \ | ||
373 | " cache %1, 0x040($1); cache %1, 0x060($1)\n" \ | ||
374 | " cache %1, 0x080($1); cache %1, 0x0a0($1)\n" \ | ||
375 | " cache %1, 0x0c0($1); cache %1, 0x0e0($1)\n" \ | ||
376 | " addiu $1, $1, 0x100\n" \ | ||
377 | " cache %1, 0x000($1); cache %1, 0x020($1)\n" \ | ||
378 | " cache %1, 0x040($1); cache %1, 0x060($1)\n" \ | ||
379 | " cache %1, 0x080($1); cache %1, 0x0a0($1)\n" \ | ||
380 | " cache %1, 0x0c0($1); cache %1, 0x0e0($1)\n" \ | ||
381 | " addiu $1, $1, 0x100\n" \ | ||
382 | " cache %1, 0x000($1); cache %1, 0x020($1)\n" \ | ||
383 | " cache %1, 0x040($1); cache %1, 0x060($1)\n" \ | ||
384 | " cache %1, 0x080($1); cache %1, 0x0a0($1)\n" \ | ||
385 | " cache %1, 0x0c0($1); cache %1, 0x0e0($1)\n" \ | ||
386 | " .set pop\n" \ | ||
387 | : \ | ||
388 | : "r" (base), \ | ||
389 | "i" (op)); | ||
390 | |||
391 | #define cache64_unroll32(base,op) \ | ||
392 | __asm__ __volatile__( \ | ||
393 | " .set push\n" \ | ||
394 | " .set noreorder\n" \ | ||
395 | " .set mips64r6\n" \ | ||
396 | " .set noat\n" \ | ||
397 | " cache %1, 0x000(%0); cache %1, 0x040(%0)\n" \ | ||
398 | " cache %1, 0x080(%0); cache %1, 0x0c0(%0)\n" \ | ||
399 | " addiu $1, %0, 0x100\n" \ | ||
400 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ | ||
401 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ | ||
402 | " addiu $1, %0, 0x100\n" \ | ||
403 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ | ||
404 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ | ||
405 | " addiu $1, %0, 0x100\n" \ | ||
406 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ | ||
407 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ | ||
408 | " addiu $1, %0, 0x100\n" \ | ||
409 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ | ||
410 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ | ||
411 | " addiu $1, %0, 0x100\n" \ | ||
412 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ | ||
413 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ | ||
414 | " addiu $1, %0, 0x100\n" \ | ||
415 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ | ||
416 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ | ||
417 | " addiu $1, %0, 0x100\n" \ | ||
418 | " cache %1, 0x000($1); cache %1, 0x040($1)\n" \ | ||
419 | " cache %1, 0x080($1); cache %1, 0x0c0($1)\n" \ | ||
420 | " .set pop\n" \ | ||
421 | : \ | ||
422 | : "r" (base), \ | ||
423 | "i" (op)); | ||
424 | |||
425 | #define cache128_unroll32(base,op) \ | ||
426 | __asm__ __volatile__( \ | ||
427 | " .set push\n" \ | ||
428 | " .set noreorder\n" \ | ||
429 | " .set mips64r6\n" \ | ||
430 | " .set noat\n" \ | ||
431 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
432 | " addiu $1, %0, 0x100\n" \ | ||
433 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
434 | " addiu $1, %0, 0x100\n" \ | ||
435 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
436 | " addiu $1, %0, 0x100\n" \ | ||
437 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
438 | " addiu $1, %0, 0x100\n" \ | ||
439 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
440 | " addiu $1, %0, 0x100\n" \ | ||
441 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
442 | " addiu $1, %0, 0x100\n" \ | ||
443 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
444 | " addiu $1, %0, 0x100\n" \ | ||
445 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
446 | " addiu $1, %0, 0x100\n" \ | ||
447 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
448 | " addiu $1, %0, 0x100\n" \ | ||
449 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
450 | " addiu $1, %0, 0x100\n" \ | ||
451 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
452 | " addiu $1, %0, 0x100\n" \ | ||
453 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
454 | " addiu $1, %0, 0x100\n" \ | ||
455 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
456 | " addiu $1, %0, 0x100\n" \ | ||
457 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
458 | " addiu $1, %0, 0x100\n" \ | ||
459 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
460 | " addiu $1, %0, 0x100\n" \ | ||
461 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
462 | " addiu $1, %0, 0x100\n" \ | ||
463 | " cache %1, 0x000(%0); cache %1, 0x080(%0)\n" \ | ||
464 | " addiu $1, %0, 0x100\n" \ | ||
465 | " .set pop\n" \ | ||
466 | : \ | ||
467 | : "r" (base), \ | ||
468 | "i" (op)); | ||
469 | #endif /* CONFIG_CPU_MIPSR6 */ | ||
470 | |||
325 | /* | 471 | /* |
326 | * Perform the cache operation specified by op using a user mode virtual | 472 | * Perform the cache operation specified by op using a user mode virtual |
327 | * address while in kernel mode. | 473 | * address while in kernel mode. |