linux/arch/mips/include/asm/asm-eva.h
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (C) 2014 Imagination Technologies Ltd.
   7 *
   8 */
   9
  10#ifndef __ASM_ASM_EVA_H
  11#define __ASM_ASM_EVA_H
  12
  13#ifndef __ASSEMBLY__
  14
  15/* Kernel variants */
  16
  17#define kernel_cache(op, base)          "cache " op ", " base "\n"
  18#define kernel_pref(hint, base)         "pref " hint ", " base "\n"
  19#define kernel_ll(reg, addr)            "ll " reg ", " addr "\n"
  20#define kernel_sc(reg, addr)            "sc " reg ", " addr "\n"
  21#define kernel_lw(reg, addr)            "lw " reg ", " addr "\n"
  22#define kernel_lwl(reg, addr)           "lwl " reg ", " addr "\n"
  23#define kernel_lwr(reg, addr)           "lwr " reg ", " addr "\n"
  24#define kernel_lh(reg, addr)            "lh " reg ", " addr "\n"
  25#define kernel_lb(reg, addr)            "lb " reg ", " addr "\n"
  26#define kernel_lbu(reg, addr)           "lbu " reg ", " addr "\n"
  27#define kernel_sw(reg, addr)            "sw " reg ", " addr "\n"
  28#define kernel_swl(reg, addr)           "swl " reg ", " addr "\n"
  29#define kernel_swr(reg, addr)           "swr " reg ", " addr "\n"
  30#define kernel_sh(reg, addr)            "sh " reg ", " addr "\n"
  31#define kernel_sb(reg, addr)            "sb " reg ", " addr "\n"
  32
  33#ifdef CONFIG_32BIT
  34/*
  35 * No 'sd' or 'ld' instructions in 32-bit but the code will
  36 * do the correct thing
  37 */
  38#define kernel_sd(reg, addr)            user_sw(reg, addr)
  39#define kernel_ld(reg, addr)            user_lw(reg, addr)
  40#else
  41#define kernel_sd(reg, addr)            "sd " reg", " addr "\n"
  42#define kernel_ld(reg, addr)            "ld " reg", " addr "\n"
  43#endif /* CONFIG_32BIT */
  44
  45#ifdef CONFIG_EVA
  46
  47#define __BUILD_EVA_INSN(insn, reg, addr)                               \
  48                                "       .set    push\n"                 \
  49                                "       .set    mips0\n"                \
  50                                "       .set    eva\n"                  \
  51                                "       "insn" "reg", "addr "\n"        \
  52                                "       .set    pop\n"
  53
  54#define user_cache(op, base)            __BUILD_EVA_INSN("cachee", op, base)
  55#define user_pref(hint, base)           __BUILD_EVA_INSN("prefe", hint, base)
  56#define user_ll(reg, addr)              __BUILD_EVA_INSN("lle", reg, addr)
  57#define user_sc(reg, addr)              __BUILD_EVA_INSN("sce", reg, addr)
  58#define user_lw(reg, addr)              __BUILD_EVA_INSN("lwe", reg, addr)
  59#define user_lwl(reg, addr)             __BUILD_EVA_INSN("lwle", reg, addr)
  60#define user_lwr(reg, addr)             __BUILD_EVA_INSN("lwre", reg, addr)
  61#define user_lh(reg, addr)              __BUILD_EVA_INSN("lhe", reg, addr)
  62#define user_lb(reg, addr)              __BUILD_EVA_INSN("lbe", reg, addr)
  63#define user_lbu(reg, addr)             __BUILD_EVA_INSN("lbue", reg, addr)
  64/* No 64-bit EVA instruction for loading double words */
  65#define user_ld(reg, addr)              user_lw(reg, addr)
  66#define user_sw(reg, addr)              __BUILD_EVA_INSN("swe", reg, addr)
  67#define user_swl(reg, addr)             __BUILD_EVA_INSN("swle", reg, addr)
  68#define user_swr(reg, addr)             __BUILD_EVA_INSN("swre", reg, addr)
  69#define user_sh(reg, addr)              __BUILD_EVA_INSN("she", reg, addr)
  70#define user_sb(reg, addr)              __BUILD_EVA_INSN("sbe", reg, addr)
  71/* No 64-bit EVA instruction for storing double words */
  72#define user_sd(reg, addr)              user_sw(reg, addr)
  73
  74#else
  75
  76#define user_cache(op, base)            kernel_cache(op, base)
  77#define user_pref(hint, base)           kernel_pref(hint, base)
  78#define user_ll(reg, addr)              kernel_ll(reg, addr)
  79#define user_sc(reg, addr)              kernel_sc(reg, addr)
  80#define user_lw(reg, addr)              kernel_lw(reg, addr)
  81#define user_lwl(reg, addr)             kernel_lwl(reg, addr)
  82#define user_lwr(reg, addr)             kernel_lwr(reg, addr)
  83#define user_lh(reg, addr)              kernel_lh(reg, addr)
  84#define user_lb(reg, addr)              kernel_lb(reg, addr)
  85#define user_lbu(reg, addr)             kernel_lbu(reg, addr)
  86#define user_sw(reg, addr)              kernel_sw(reg, addr)
  87#define user_swl(reg, addr)             kernel_swl(reg, addr)
  88#define user_swr(reg, addr)             kernel_swr(reg, addr)
  89#define user_sh(reg, addr)              kernel_sh(reg, addr)
  90#define user_sb(reg, addr)              kernel_sb(reg, addr)
  91
  92#ifdef CONFIG_32BIT
  93#define user_sd(reg, addr)              kernel_sw(reg, addr)
  94#define user_ld(reg, addr)              kernel_lw(reg, addr)
  95#else
  96#define user_sd(reg, addr)              kernel_sd(reg, addr)
  97#define user_ld(reg, addr)              kernel_ld(reg, addr)
  98#endif /* CONFIG_32BIT */
  99
 100#endif /* CONFIG_EVA */
 101
 102#else /* __ASSEMBLY__ */
 103
 104#define kernel_cache(op, base)          cache op, base
 105#define kernel_pref(hint, base)         pref hint, base
 106#define kernel_ll(reg, addr)            ll reg, addr
 107#define kernel_sc(reg, addr)            sc reg, addr
 108#define kernel_lw(reg, addr)            lw reg, addr
 109#define kernel_lwl(reg, addr)           lwl reg, addr
 110#define kernel_lwr(reg, addr)           lwr reg, addr
 111#define kernel_lh(reg, addr)            lh reg, addr
 112#define kernel_lb(reg, addr)            lb reg, addr
 113#define kernel_lbu(reg, addr)           lbu reg, addr
 114#define kernel_sw(reg, addr)            sw reg, addr
 115#define kernel_swl(reg, addr)           swl reg, addr
 116#define kernel_swr(reg, addr)           swr reg, addr
 117#define kernel_sh(reg, addr)            sh reg, addr
 118#define kernel_sb(reg, addr)            sb reg, addr
 119
 120#ifdef CONFIG_32BIT
 121/*
 122 * No 'sd' or 'ld' instructions in 32-bit but the code will
 123 * do the correct thing
 124 */
 125#define kernel_sd(reg, addr)            user_sw(reg, addr)
 126#define kernel_ld(reg, addr)            user_lw(reg, addr)
 127#else
 128#define kernel_sd(reg, addr)            sd reg, addr
 129#define kernel_ld(reg, addr)            ld reg, addr
 130#endif /* CONFIG_32BIT */
 131
 132#ifdef CONFIG_EVA
 133
 134#define __BUILD_EVA_INSN(insn, reg, addr)                       \
 135                                .set    push;                   \
 136                                .set    mips0;                  \
 137                                .set    eva;                    \
 138                                insn reg, addr;                 \
 139                                .set    pop;
 140
 141#define user_cache(op, base)            __BUILD_EVA_INSN(cachee, op, base)
 142#define user_pref(hint, base)           __BUILD_EVA_INSN(prefe, hint, base)
 143#define user_ll(reg, addr)              __BUILD_EVA_INSN(lle, reg, addr)
 144#define user_sc(reg, addr)              __BUILD_EVA_INSN(sce, reg, addr)
 145#define user_lw(reg, addr)              __BUILD_EVA_INSN(lwe, reg, addr)
 146#define user_lwl(reg, addr)             __BUILD_EVA_INSN(lwle, reg, addr)
 147#define user_lwr(reg, addr)             __BUILD_EVA_INSN(lwre, reg, addr)
 148#define user_lh(reg, addr)              __BUILD_EVA_INSN(lhe, reg, addr)
 149#define user_lb(reg, addr)              __BUILD_EVA_INSN(lbe, reg, addr)
 150#define user_lbu(reg, addr)             __BUILD_EVA_INSN(lbue, reg, addr)
 151/* No 64-bit EVA instruction for loading double words */
 152#define user_ld(reg, addr)              user_lw(reg, addr)
 153#define user_sw(reg, addr)              __BUILD_EVA_INSN(swe, reg, addr)
 154#define user_swl(reg, addr)             __BUILD_EVA_INSN(swle, reg, addr)
 155#define user_swr(reg, addr)             __BUILD_EVA_INSN(swre, reg, addr)
 156#define user_sh(reg, addr)              __BUILD_EVA_INSN(she, reg, addr)
 157#define user_sb(reg, addr)              __BUILD_EVA_INSN(sbe, reg, addr)
 158/* No 64-bit EVA instruction for loading double words */
 159#define user_sd(reg, addr)              user_sw(reg, addr)
 160#else
 161
 162#define user_cache(op, base)            kernel_cache(op, base)
 163#define user_pref(hint, base)           kernel_pref(hint, base)
 164#define user_ll(reg, addr)              kernel_ll(reg, addr)
 165#define user_sc(reg, addr)              kernel_sc(reg, addr)
 166#define user_lw(reg, addr)              kernel_lw(reg, addr)
 167#define user_lwl(reg, addr)             kernel_lwl(reg, addr)
 168#define user_lwr(reg, addr)             kernel_lwr(reg, addr)
 169#define user_lh(reg, addr)              kernel_lh(reg, addr)
 170#define user_lb(reg, addr)              kernel_lb(reg, addr)
 171#define user_lbu(reg, addr)             kernel_lbu(reg, addr)
 172#define user_sw(reg, addr)              kernel_sw(reg, addr)
 173#define user_swl(reg, addr)             kernel_swl(reg, addr)
 174#define user_swr(reg, addr)             kernel_swr(reg, addr)
 175#define user_sh(reg, addr)              kernel_sh(reg, addr)
 176#define user_sb(reg, addr)              kernel_sb(reg, addr)
 177
 178#ifdef CONFIG_32BIT
 179#define user_sd(reg, addr)              kernel_sw(reg, addr)
 180#define user_ld(reg, addr)              kernel_lw(reg, addr)
 181#else
 182#define user_sd(reg, addr)              kernel_sd(reg, addr)
 183#define user_ld(reg, addr)              kernel_ld(reg, addr)
 184#endif /* CONFIG_32BIT */
 185
 186#endif /* CONFIG_EVA */
 187
 188#endif /* __ASSEMBLY__ */
 189
 190#endif /* __ASM_ASM_EVA_H */
 191