1cddd6386SCharlie Jenkins /* SPDX-License-Identifier: GPL-2.0 */ 2cddd6386SCharlie Jenkins #ifndef _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_H 3cddd6386SCharlie Jenkins #define _ASM_RISCV_VENDOR_EXTENSIONS_THEAD_H 4cddd6386SCharlie Jenkins 5cddd6386SCharlie Jenkins #include <asm/vendor_extensions.h> 6cddd6386SCharlie Jenkins 7cddd6386SCharlie Jenkins #include <linux/types.h> 8cddd6386SCharlie Jenkins 9cddd6386SCharlie Jenkins /* 10cddd6386SCharlie Jenkins * Extension keys must be strictly less than RISCV_ISA_VENDOR_EXT_MAX. 11cddd6386SCharlie Jenkins */ 12cddd6386SCharlie Jenkins #define RISCV_ISA_VENDOR_EXT_XTHEADVECTOR 0 13cddd6386SCharlie Jenkins 14cddd6386SCharlie Jenkins extern struct riscv_isa_vendor_ext_data_list riscv_isa_vendor_ext_list_thead; 15cddd6386SCharlie Jenkins 16377be47fSCharlie Jenkins #ifdef CONFIG_RISCV_ISA_VENDOR_EXT_THEAD 17377be47fSCharlie Jenkins void disable_xtheadvector(void); 18377be47fSCharlie Jenkins #else 19377be47fSCharlie Jenkins static inline void disable_xtheadvector(void) { } 20377be47fSCharlie Jenkins #endif 21377be47fSCharlie Jenkins 22*01e3313eSCharlie Jenkins /* Extension specific helpers */ 23*01e3313eSCharlie Jenkins 24*01e3313eSCharlie Jenkins /* 25*01e3313eSCharlie Jenkins * Vector 0.7.1 as used for example on T-Head Xuantie cores, uses an older 26*01e3313eSCharlie Jenkins * encoding for vsetvli (ta, ma vs. d1), so provide an instruction for 27*01e3313eSCharlie Jenkins * vsetvli t4, x0, e8, m8, d1 28*01e3313eSCharlie Jenkins */ 29*01e3313eSCharlie Jenkins #define THEAD_VSETVLI_T4X0E8M8D1 ".long 0x00307ed7\n\t" 30*01e3313eSCharlie Jenkins 31*01e3313eSCharlie Jenkins /* 32*01e3313eSCharlie Jenkins * While in theory, the vector-0.7.1 vsb.v and vlb.v result in the same 33*01e3313eSCharlie Jenkins * encoding as the standard vse8.v and vle8.v, compilers seem to optimize 34*01e3313eSCharlie Jenkins * the call resulting in a different encoding and then using a value for 35*01e3313eSCharlie Jenkins * the "mop" field that is not part of vector-0.7.1 36*01e3313eSCharlie Jenkins * So encode specific variants for vstate_save and _restore. 37*01e3313eSCharlie Jenkins */ 38*01e3313eSCharlie Jenkins #define THEAD_VSB_V_V0T0 ".long 0x02028027\n\t" 39*01e3313eSCharlie Jenkins #define THEAD_VSB_V_V8T0 ".long 0x02028427\n\t" 40*01e3313eSCharlie Jenkins #define THEAD_VSB_V_V16T0 ".long 0x02028827\n\t" 41*01e3313eSCharlie Jenkins #define THEAD_VSB_V_V24T0 ".long 0x02028c27\n\t" 42*01e3313eSCharlie Jenkins #define THEAD_VLB_V_V0T0 ".long 0x012028007\n\t" 43*01e3313eSCharlie Jenkins #define THEAD_VLB_V_V8T0 ".long 0x012028407\n\t" 44*01e3313eSCharlie Jenkins #define THEAD_VLB_V_V16T0 ".long 0x012028807\n\t" 45*01e3313eSCharlie Jenkins #define THEAD_VLB_V_V24T0 ".long 0x012028c07\n\t" 46*01e3313eSCharlie Jenkins 47cddd6386SCharlie Jenkins #endif 48