xref: /linux/arch/riscv/include/asm/vendor_extensions/thead.h (revision 1b5f3c51fbb8042efb314484b47b2092cdd40bf6)
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