| /* |
| * This file is subject to the terms and conditions of the GNU General Public |
| * License. See the file "COPYING" in the main directory of this archive |
| * for more details. |
| * |
| * Copyright (C) 2014 Imagination Technologies Ltd. |
| * |
| */ |
| |
| #ifndef __ASM_ASM_EVA_H |
| #define __ASM_ASM_EVA_H |
| |
| #ifndef __ASSEMBLY__ |
| |
| /* Kernel variants */ |
| |
| #define kernel_cache(op, base) "cache " op ", " base "\n" |
| #define kernel_ll(reg, addr) "ll " reg ", " addr "\n" |
| #define kernel_sc(reg, addr) "sc " reg ", " addr "\n" |
| #define kernel_lw(reg, addr) "lw " reg ", " addr "\n" |
| #define kernel_lwl(reg, addr) "lwl " reg ", " addr "\n" |
| #define kernel_lwr(reg, addr) "lwr " reg ", " addr "\n" |
| #define kernel_lh(reg, addr) "lh " reg ", " addr "\n" |
| #define kernel_lb(reg, addr) "lb " reg ", " addr "\n" |
| #define kernel_lbu(reg, addr) "lbu " reg ", " addr "\n" |
| #define kernel_sw(reg, addr) "sw " reg ", " addr "\n" |
| #define kernel_swl(reg, addr) "swl " reg ", " addr "\n" |
| #define kernel_swr(reg, addr) "swr " reg ", " addr "\n" |
| #define kernel_sh(reg, addr) "sh " reg ", " addr "\n" |
| #define kernel_sb(reg, addr) "sb " reg ", " addr "\n" |
| |
| #ifdef CONFIG_32BIT |
| /* |
| * No 'sd' or 'ld' instructions in 32-bit but the code will |
| * do the correct thing |
| */ |
| #define kernel_sd(reg, addr) user_sw(reg, addr) |
| #define kernel_ld(reg, addr) user_lw(reg, addr) |
| #else |
| #define kernel_sd(reg, addr) "sd " reg", " addr "\n" |
| #define kernel_ld(reg, addr) "ld " reg", " addr "\n" |
| #endif /* CONFIG_32BIT */ |
| |
| #ifdef CONFIG_EVA |
| |
| #define __BUILD_EVA_INSN(insn, reg, addr) \ |
| " .set push\n" \ |
| " .set mips0\n" \ |
| " .set eva\n" \ |
| " "insn" "reg", "addr "\n" \ |
| " .set pop\n" |
| |
| #define user_cache(op, base) __BUILD_EVA_INSN("cachee", op, base) |
| #define user_ll(reg, addr) __BUILD_EVA_INSN("lle", reg, addr) |
| #define user_sc(reg, addr) __BUILD_EVA_INSN("sce", reg, addr) |
| #define user_lw(reg, addr) __BUILD_EVA_INSN("lwe", reg, addr) |
| #define user_lwl(reg, addr) __BUILD_EVA_INSN("lwle", reg, addr) |
| #define user_lwr(reg, addr) __BUILD_EVA_INSN("lwre", reg, addr) |
| #define user_lh(reg, addr) __BUILD_EVA_INSN("lhe", reg, addr) |
| #define user_lb(reg, addr) __BUILD_EVA_INSN("lbe", reg, addr) |
| #define user_lbu(reg, addr) __BUILD_EVA_INSN("lbue", reg, addr) |
| /* No 64-bit EVA instruction for loading double words */ |
| #define user_ld(reg, addr) user_lw(reg, addr) |
| #define user_sw(reg, addr) __BUILD_EVA_INSN("swe", reg, addr) |
| #define user_swl(reg, addr) __BUILD_EVA_INSN("swle", reg, addr) |
| #define user_swr(reg, addr) __BUILD_EVA_INSN("swre", reg, addr) |
| #define user_sh(reg, addr) __BUILD_EVA_INSN("she", reg, addr) |
| #define user_sb(reg, addr) __BUILD_EVA_INSN("sbe", reg, addr) |
| /* No 64-bit EVA instruction for storing double words */ |
| #define user_sd(reg, addr) user_sw(reg, addr) |
| |
| #else |
| |
| #define user_cache(op, base) kernel_cache(op, base) |
| #define user_ll(reg, addr) kernel_ll(reg, addr) |
| #define user_sc(reg, addr) kernel_sc(reg, addr) |
| #define user_lw(reg, addr) kernel_lw(reg, addr) |
| #define user_lwl(reg, addr) kernel_lwl(reg, addr) |
| #define user_lwr(reg, addr) kernel_lwr(reg, addr) |
| #define user_lh(reg, addr) kernel_lh(reg, addr) |
| #define user_lb(reg, addr) kernel_lb(reg, addr) |
| #define user_lbu(reg, addr) kernel_lbu(reg, addr) |
| #define user_sw(reg, addr) kernel_sw(reg, addr) |
| #define user_swl(reg, addr) kernel_swl(reg, addr) |
| #define user_swr(reg, addr) kernel_swr(reg, addr) |
| #define user_sh(reg, addr) kernel_sh(reg, addr) |
| #define user_sb(reg, addr) kernel_sb(reg, addr) |
| |
| #ifdef CONFIG_32BIT |
| #define user_sd(reg, addr) kernel_sw(reg, addr) |
| #define user_ld(reg, addr) kernel_lw(reg, addr) |
| #else |
| #define user_sd(reg, addr) kernel_sd(reg, addr) |
| #define user_ld(reg, addr) kernel_ld(reg, addr) |
| #endif /* CONFIG_32BIT */ |
| |
| #endif /* CONFIG_EVA */ |
| |
| #else /* __ASSEMBLY__ */ |
| |
| #define kernel_cache(op, base) cache op, base |
| #define kernel_ll(reg, addr) ll reg, addr |
| #define kernel_sc(reg, addr) sc reg, addr |
| #define kernel_lw(reg, addr) lw reg, addr |
| #define kernel_lwl(reg, addr) lwl reg, addr |
| #define kernel_lwr(reg, addr) lwr reg, addr |
| #define kernel_lh(reg, addr) lh reg, addr |
| #define kernel_lb(reg, addr) lb reg, addr |
| #define kernel_lbu(reg, addr) lbu reg, addr |
| #define kernel_sw(reg, addr) sw reg, addr |
| #define kernel_swl(reg, addr) swl reg, addr |
| #define kernel_swr(reg, addr) swr reg, addr |
| #define kernel_sh(reg, addr) sh reg, addr |
| #define kernel_sb(reg, addr) sb reg, addr |
| |
| #ifdef CONFIG_32BIT |
| /* |
| * No 'sd' or 'ld' instructions in 32-bit but the code will |
| * do the correct thing |
| */ |
| #define kernel_sd(reg, addr) user_sw(reg, addr) |
| #define kernel_ld(reg, addr) user_lw(reg, addr) |
| #else |
| #define kernel_sd(reg, addr) sd reg, addr |
| #define kernel_ld(reg, addr) ld reg, addr |
| #endif /* CONFIG_32BIT */ |
| |
| #ifdef CONFIG_EVA |
| |
| #define __BUILD_EVA_INSN(insn, reg, addr) \ |
| .set push; \ |
| .set mips0; \ |
| .set eva; \ |
| insn reg, addr; \ |
| .set pop; |
| |
| #define user_cache(op, base) __BUILD_EVA_INSN(cachee, op, base) |
| #define user_ll(reg, addr) __BUILD_EVA_INSN(lle, reg, addr) |
| #define user_sc(reg, addr) __BUILD_EVA_INSN(sce, reg, addr) |
| #define user_lw(reg, addr) __BUILD_EVA_INSN(lwe, reg, addr) |
| #define user_lwl(reg, addr) __BUILD_EVA_INSN(lwle, reg, addr) |
| #define user_lwr(reg, addr) __BUILD_EVA_INSN(lwre, reg, addr) |
| #define user_lh(reg, addr) __BUILD_EVA_INSN(lhe, reg, addr) |
| #define user_lb(reg, addr) __BUILD_EVA_INSN(lbe, reg, addr) |
| #define user_lbu(reg, addr) __BUILD_EVA_INSN(lbue, reg, addr) |
| /* No 64-bit EVA instruction for loading double words */ |
| #define user_ld(reg, addr) user_lw(reg, addr) |
| #define user_sw(reg, addr) __BUILD_EVA_INSN(swe, reg, addr) |
| #define user_swl(reg, addr) __BUILD_EVA_INSN(swle, reg, addr) |
| #define user_swr(reg, addr) __BUILD_EVA_INSN(swre, reg, addr) |
| #define user_sh(reg, addr) __BUILD_EVA_INSN(she, reg, addr) |
| #define user_sb(reg, addr) __BUILD_EVA_INSN(sbe, reg, addr) |
| /* No 64-bit EVA instruction for loading double words */ |
| #define user_sd(reg, addr) user_sw(reg, addr) |
| #else |
| |
| #define user_cache(op, base) kernel_cache(op, base) |
| #define user_ll(reg, addr) kernel_ll(reg, addr) |
| #define user_sc(reg, addr) kernel_sc(reg, addr) |
| #define user_lw(reg, addr) kernel_lw(reg, addr) |
| #define user_lwl(reg, addr) kernel_lwl(reg, addr) |
| #define user_lwr(reg, addr) kernel_lwr(reg, addr) |
| #define user_lh(reg, addr) kernel_lh(reg, addr) |
| #define user_lb(reg, addr) kernel_lb(reg, addr) |
| #define user_lbu(reg, addr) kernel_lbu(reg, addr) |
| #define user_sw(reg, addr) kernel_sw(reg, addr) |
| #define user_swl(reg, addr) kernel_swl(reg, addr) |
| #define user_swr(reg, addr) kernel_swr(reg, addr) |
| #define user_sh(reg, addr) kernel_sh(reg, addr) |
| #define user_sb(reg, addr) kernel_sb(reg, addr) |
| |
| #ifdef CONFIG_32BIT |
| #define user_sd(reg, addr) kernel_sw(reg, addr) |
| #define user_ld(reg, addr) kernel_lw(reg, addr) |
| #else |
| #define user_sd(reg, addr) kernel_sd(reg, addr) |
| #define user_ld(reg, addr) kernel_sd(reg, addr) |
| #endif /* CONFIG_32BIT */ |
| |
| #endif /* CONFIG_EVA */ |
| |
| #endif /* __ASSEMBLY__ */ |
| |
| #endif /* __ASM_ASM_EVA_H */ |