s390/fpu: move, rename, and merge header files
authorHeiko Carstens <hca@linux.ibm.com>
Sat, 3 Feb 2024 10:45:02 +0000 (11:45 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Fri, 16 Feb 2024 13:30:14 +0000 (14:30 +0100)
Move, rename, and merge the fpu and vx header files. This way fpu header
files have a consistent naming scheme (fpu*.h).

Also get rid of the fpu subdirectory and move header files to asm
directory, so that all fpu and vx header files can be found at the same
location.

Merge internal.h header file into other header files, since the internal
helpers are used at many locations. so those helper functions are really
not internal.

Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
34 files changed:
arch/s390/crypto/chacha-glue.c
arch/s390/crypto/chacha-s390.S
arch/s390/crypto/crc32-vx.c
arch/s390/crypto/crc32be-vx.S
arch/s390/crypto/crc32le-vx.S
arch/s390/include/asm/asm-prototypes.h
arch/s390/include/asm/entry-common.h
arch/s390/include/asm/fpu-insn-asm.h [new file with mode: 0644]
arch/s390/include/asm/fpu-insn.h [new file with mode: 0644]
arch/s390/include/asm/fpu-types.h [new file with mode: 0644]
arch/s390/include/asm/fpu.h [new file with mode: 0644]
arch/s390/include/asm/fpu/api.h [deleted file]
arch/s390/include/asm/fpu/internal.h [deleted file]
arch/s390/include/asm/fpu/types.h [deleted file]
arch/s390/include/asm/kvm_host.h
arch/s390/include/asm/processor.h
arch/s390/include/asm/vx-insn-asm.h [deleted file]
arch/s390/include/asm/vx-insn.h [deleted file]
arch/s390/kernel/compat_signal.c
arch/s390/kernel/crash_dump.c
arch/s390/kernel/early.c
arch/s390/kernel/entry.S
arch/s390/kernel/fpu.c
arch/s390/kernel/machine_kexec.c
arch/s390/kernel/nmi.c
arch/s390/kernel/perf_regs.c
arch/s390/kernel/process.c
arch/s390/kernel/ptrace.c
arch/s390/kernel/smp.c
arch/s390/kernel/sysinfo.c
arch/s390/kernel/traps.c
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/vsie.c
lib/raid6/s390vx.uc

index a823132..97098ad 100644 (file)
@@ -15,7 +15,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/sizes.h>
-#include <asm/fpu/api.h>
+#include <asm/fpu.h>
 #include "chacha-s390.h"
 
 static void chacha20_crypt_s390(u32 *state, u8 *dst, const u8 *src,
index 37cb63f..63f3102 100644 (file)
@@ -8,7 +8,7 @@
 
 #include <linux/linkage.h>
 #include <asm/nospec-insn.h>
-#include <asm/vx-insn.h>
+#include <asm/fpu-insn.h>
 
 #define SP     %r15
 #define FRAME  (16 * 8 + 4 * 8)
index 6ae3e3f..dc2997f 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/cpufeature.h>
 #include <linux/crc32.h>
 #include <crypto/internal/hash.h>
-#include <asm/fpu/api.h>
+#include <asm/fpu.h>
 
 
 #define CRC32_BLOCK_SIZE       1
index 34ee479..f2dc8a6 100644 (file)
@@ -14,7 +14,7 @@
 
 #include <linux/linkage.h>
 #include <asm/nospec-insn.h>
-#include <asm/vx-insn.h>
+#include <asm/fpu-insn.h>
 
 /* Vector register range containing CRC-32 constants */
 #define CONST_R1R2             %v9
index 5a819ae..df19e06 100644 (file)
@@ -15,7 +15,7 @@
 
 #include <linux/linkage.h>
 #include <asm/nospec-insn.h>
-#include <asm/vx-insn.h>
+#include <asm/fpu-insn.h>
 
 /* Vector register range containing CRC-32 constants */
 #define CONST_PERM_LE2BE       %v9
index a873e87..56096ae 100644 (file)
@@ -3,7 +3,7 @@
 
 #include <linux/kvm_host.h>
 #include <linux/ftrace.h>
-#include <asm/fpu/api.h>
+#include <asm/fpu.h>
 #include <asm-generic/asm-prototypes.h>
 
 __int128_t __ashlti3(__int128_t a, int b);
index fdd319a..a1dbab1 100644 (file)
@@ -8,7 +8,7 @@
 #include <linux/processor.h>
 #include <linux/uaccess.h>
 #include <asm/timex.h>
-#include <asm/fpu/api.h>
+#include <asm/fpu.h>
 #include <asm/pai.h>
 
 #define ARCH_EXIT_TO_USER_MODE_WORK (_TIF_GUARDED_STORAGE | _TIF_PER_TRAP)
diff --git a/arch/s390/include/asm/fpu-insn-asm.h b/arch/s390/include/asm/fpu-insn-asm.h
new file mode 100644 (file)
index 0000000..789d626
--- /dev/null
@@ -0,0 +1,703 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Support for Vector Instructions
+ *
+ * Assembler macros to generate .byte/.word code for particular
+ * vector instructions that are supported by recent binutils (>= 2.26) only.
+ *
+ * Copyright IBM Corp. 2015
+ * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
+ */
+
+#ifndef __ASM_S390_FPU_INSN_ASM_H
+#define __ASM_S390_FPU_INSN_ASM_H
+
+#ifndef __ASM_S390_FPU_INSN_H
+#error only <asm/fpu-insn.h> can be included directly
+#endif
+
+#ifdef __ASSEMBLY__
+
+/* Macros to generate vector instruction byte code */
+
+/* GR_NUM - Retrieve general-purpose register number
+ *
+ * @opd:       Operand to store register number
+ * @r64:       String designation register in the format "%rN"
+ */
+.macro GR_NUM  opd gr
+       \opd = 255
+       .ifc \gr,%r0
+               \opd = 0
+       .endif
+       .ifc \gr,%r1
+               \opd = 1
+       .endif
+       .ifc \gr,%r2
+               \opd = 2
+       .endif
+       .ifc \gr,%r3
+               \opd = 3
+       .endif
+       .ifc \gr,%r4
+               \opd = 4
+       .endif
+       .ifc \gr,%r5
+               \opd = 5
+       .endif
+       .ifc \gr,%r6
+               \opd = 6
+       .endif
+       .ifc \gr,%r7
+               \opd = 7
+       .endif
+       .ifc \gr,%r8
+               \opd = 8
+       .endif
+       .ifc \gr,%r9
+               \opd = 9
+       .endif
+       .ifc \gr,%r10
+               \opd = 10
+       .endif
+       .ifc \gr,%r11
+               \opd = 11
+       .endif
+       .ifc \gr,%r12
+               \opd = 12
+       .endif
+       .ifc \gr,%r13
+               \opd = 13
+       .endif
+       .ifc \gr,%r14
+               \opd = 14
+       .endif
+       .ifc \gr,%r15
+               \opd = 15
+       .endif
+       .if \opd == 255
+               \opd = \gr
+       .endif
+.endm
+
+/* VX_NUM - Retrieve vector register number
+ *
+ * @opd:       Operand to store register number
+ * @vxr:       String designation register in the format "%vN"
+ *
+ * The vector register number is used for as input number to the
+ * instruction and, as well as, to compute the RXB field of the
+ * instruction.
+ */
+.macro VX_NUM  opd vxr
+       \opd = 255
+       .ifc \vxr,%v0
+               \opd = 0
+       .endif
+       .ifc \vxr,%v1
+               \opd = 1
+       .endif
+       .ifc \vxr,%v2
+               \opd = 2
+       .endif
+       .ifc \vxr,%v3
+               \opd = 3
+       .endif
+       .ifc \vxr,%v4
+               \opd = 4
+       .endif
+       .ifc \vxr,%v5
+               \opd = 5
+       .endif
+       .ifc \vxr,%v6
+               \opd = 6
+       .endif
+       .ifc \vxr,%v7
+               \opd = 7
+       .endif
+       .ifc \vxr,%v8
+               \opd = 8
+       .endif
+       .ifc \vxr,%v9
+               \opd = 9
+       .endif
+       .ifc \vxr,%v10
+               \opd = 10
+       .endif
+       .ifc \vxr,%v11
+               \opd = 11
+       .endif
+       .ifc \vxr,%v12
+               \opd = 12
+       .endif
+       .ifc \vxr,%v13
+               \opd = 13
+       .endif
+       .ifc \vxr,%v14
+               \opd = 14
+       .endif
+       .ifc \vxr,%v15
+               \opd = 15
+       .endif
+       .ifc \vxr,%v16
+               \opd = 16
+       .endif
+       .ifc \vxr,%v17
+               \opd = 17
+       .endif
+       .ifc \vxr,%v18
+               \opd = 18
+       .endif
+       .ifc \vxr,%v19
+               \opd = 19
+       .endif
+       .ifc \vxr,%v20
+               \opd = 20
+       .endif
+       .ifc \vxr,%v21
+               \opd = 21
+       .endif
+       .ifc \vxr,%v22
+               \opd = 22
+       .endif
+       .ifc \vxr,%v23
+               \opd = 23
+       .endif
+       .ifc \vxr,%v24
+               \opd = 24
+       .endif
+       .ifc \vxr,%v25
+               \opd = 25
+       .endif
+       .ifc \vxr,%v26
+               \opd = 26
+       .endif
+       .ifc \vxr,%v27
+               \opd = 27
+       .endif
+       .ifc \vxr,%v28
+               \opd = 28
+       .endif
+       .ifc \vxr,%v29
+               \opd = 29
+       .endif
+       .ifc \vxr,%v30
+               \opd = 30
+       .endif
+       .ifc \vxr,%v31
+               \opd = 31
+       .endif
+       .if \opd == 255
+               \opd = \vxr
+       .endif
+.endm
+
+/* RXB - Compute most significant bit used vector registers
+ *
+ * @rxb:       Operand to store computed RXB value
+ * @v1:                Vector register designated operand whose MSB is stored in
+ *             RXB bit 0 (instruction bit 36) and whose remaining bits
+ *             are stored in instruction bits 8-11.
+ * @v2:                Vector register designated operand whose MSB is stored in
+ *             RXB bit 1 (instruction bit 37) and whose remaining bits
+ *             are stored in instruction bits 12-15.
+ * @v3:                Vector register designated operand whose MSB is stored in
+ *             RXB bit 2 (instruction bit 38) and whose remaining bits
+ *             are stored in instruction bits 16-19.
+ * @v4:                Vector register designated operand whose MSB is stored in
+ *             RXB bit 3 (instruction bit 39) and whose remaining bits
+ *             are stored in instruction bits 32-35.
+ *
+ * Note: In most vector instruction formats [1] V1, V2, V3, and V4 directly
+ * correspond to @v1, @v2, @v3, and @v4. But there are exceptions, such as but
+ * not limited to the vector instruction formats VRR-g, VRR-h, VRS-a, VRS-d,
+ * and VSI.
+ *
+ * [1] IBM z/Architecture Principles of Operation, chapter "Program
+ * Execution, section "Instructions", subsection "Instruction Formats".
+ */
+.macro RXB     rxb v1 v2=0 v3=0 v4=0
+       \rxb = 0
+       .if \v1 & 0x10
+               \rxb = \rxb | 0x08
+       .endif
+       .if \v2 & 0x10
+               \rxb = \rxb | 0x04
+       .endif
+       .if \v3 & 0x10
+               \rxb = \rxb | 0x02
+       .endif
+       .if \v4 & 0x10
+               \rxb = \rxb | 0x01
+       .endif
+.endm
+
+/* MRXB - Generate Element Size Control and RXB value
+ *
+ * @m:         Element size control
+ * @v1:                First vector register designated operand (for RXB)
+ * @v2:                Second vector register designated operand (for RXB)
+ * @v3:                Third vector register designated operand (for RXB)
+ * @v4:                Fourth vector register designated operand (for RXB)
+ *
+ * Note: For @v1, @v2, @v3, and @v4 also refer to the RXB macro
+ * description for further details.
+ */
+.macro MRXB    m v1 v2=0 v3=0 v4=0
+       rxb = 0
+       RXB     rxb, \v1, \v2, \v3, \v4
+       .byte   (\m << 4) | rxb
+.endm
+
+/* MRXBOPC - Generate Element Size Control, RXB, and final Opcode fields
+ *
+ * @m:         Element size control
+ * @opc:       Opcode
+ * @v1:                First vector register designated operand (for RXB)
+ * @v2:                Second vector register designated operand (for RXB)
+ * @v3:                Third vector register designated operand (for RXB)
+ * @v4:                Fourth vector register designated operand (for RXB)
+ *
+ * Note: For @v1, @v2, @v3, and @v4 also refer to the RXB macro
+ * description for further details.
+ */
+.macro MRXBOPC m opc v1 v2=0 v3=0 v4=0
+       MRXB    \m, \v1, \v2, \v3, \v4
+       .byte   \opc
+.endm
+
+/* Vector support instructions */
+
+/* VECTOR GENERATE BYTE MASK */
+.macro VGBM    vr imm2
+       VX_NUM  v1, \vr
+       .word   (0xE700 | ((v1&15) << 4))
+       .word   \imm2
+       MRXBOPC 0, 0x44, v1
+.endm
+.macro VZERO   vxr
+       VGBM    \vxr, 0
+.endm
+.macro VONE    vxr
+       VGBM    \vxr, 0xFFFF
+.endm
+
+/* VECTOR LOAD VR ELEMENT FROM GR */
+.macro VLVG    v, gr, disp, m
+       VX_NUM  v1, \v
+       GR_NUM  b2, "%r0"
+       GR_NUM  r3, \gr
+       .word   0xE700 | ((v1&15) << 4) | r3
+       .word   (b2 << 12) | (\disp)
+       MRXBOPC \m, 0x22, v1
+.endm
+.macro VLVGB   v, gr, index, base
+       VLVG    \v, \gr, \index, \base, 0
+.endm
+.macro VLVGH   v, gr, index
+       VLVG    \v, \gr, \index, 1
+.endm
+.macro VLVGF   v, gr, index
+       VLVG    \v, \gr, \index, 2
+.endm
+.macro VLVGG   v, gr, index
+       VLVG    \v, \gr, \index, 3
+.endm
+
+/* VECTOR LOAD REGISTER */
+.macro VLR     v1, v2
+       VX_NUM  v1, \v1
+       VX_NUM  v2, \v2
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   0
+       MRXBOPC 0, 0x56, v1, v2
+.endm
+
+/* VECTOR LOAD */
+.macro VL      v, disp, index="%r0", base
+       VX_NUM  v1, \v
+       GR_NUM  x2, \index
+       GR_NUM  b2, \base
+       .word   0xE700 | ((v1&15) << 4) | x2
+       .word   (b2 << 12) | (\disp)
+       MRXBOPC 0, 0x06, v1
+.endm
+
+/* VECTOR LOAD ELEMENT */
+.macro VLEx    vr1, disp, index="%r0", base, m3, opc
+       VX_NUM  v1, \vr1
+       GR_NUM  x2, \index
+       GR_NUM  b2, \base
+       .word   0xE700 | ((v1&15) << 4) | x2
+       .word   (b2 << 12) | (\disp)
+       MRXBOPC \m3, \opc, v1
+.endm
+.macro VLEB    vr1, disp, index="%r0", base, m3
+       VLEx    \vr1, \disp, \index, \base, \m3, 0x00
+.endm
+.macro VLEH    vr1, disp, index="%r0", base, m3
+       VLEx    \vr1, \disp, \index, \base, \m3, 0x01
+.endm
+.macro VLEF    vr1, disp, index="%r0", base, m3
+       VLEx    \vr1, \disp, \index, \base, \m3, 0x03
+.endm
+.macro VLEG    vr1, disp, index="%r0", base, m3
+       VLEx    \vr1, \disp, \index, \base, \m3, 0x02
+.endm
+
+/* VECTOR LOAD ELEMENT IMMEDIATE */
+.macro VLEIx   vr1, imm2, m3, opc
+       VX_NUM  v1, \vr1
+       .word   0xE700 | ((v1&15) << 4)
+       .word   \imm2
+       MRXBOPC \m3, \opc, v1
+.endm
+.macro VLEIB   vr1, imm2, index
+       VLEIx   \vr1, \imm2, \index, 0x40
+.endm
+.macro VLEIH   vr1, imm2, index
+       VLEIx   \vr1, \imm2, \index, 0x41
+.endm
+.macro VLEIF   vr1, imm2, index
+       VLEIx   \vr1, \imm2, \index, 0x43
+.endm
+.macro VLEIG   vr1, imm2, index
+       VLEIx   \vr1, \imm2, \index, 0x42
+.endm
+
+/* VECTOR LOAD GR FROM VR ELEMENT */
+.macro VLGV    gr, vr, disp, base="%r0", m
+       GR_NUM  r1, \gr
+       GR_NUM  b2, \base
+       VX_NUM  v3, \vr
+       .word   0xE700 | (r1 << 4) | (v3&15)
+       .word   (b2 << 12) | (\disp)
+       MRXBOPC \m, 0x21, 0, v3
+.endm
+.macro VLGVB   gr, vr, disp, base="%r0"
+       VLGV    \gr, \vr, \disp, \base, 0
+.endm
+.macro VLGVH   gr, vr, disp, base="%r0"
+       VLGV    \gr, \vr, \disp, \base, 1
+.endm
+.macro VLGVF   gr, vr, disp, base="%r0"
+       VLGV    \gr, \vr, \disp, \base, 2
+.endm
+.macro VLGVG   gr, vr, disp, base="%r0"
+       VLGV    \gr, \vr, \disp, \base, 3
+.endm
+
+/* VECTOR LOAD MULTIPLE */
+.macro VLM     vfrom, vto, disp, base, hint=3
+       VX_NUM  v1, \vfrom
+       VX_NUM  v3, \vto
+       GR_NUM  b2, \base
+       .word   0xE700 | ((v1&15) << 4) | (v3&15)
+       .word   (b2 << 12) | (\disp)
+       MRXBOPC \hint, 0x36, v1, v3
+.endm
+
+/* VECTOR STORE */
+.macro VST     vr1, disp, index="%r0", base
+       VX_NUM  v1, \vr1
+       GR_NUM  x2, \index
+       GR_NUM  b2, \base
+       .word   0xE700 | ((v1&15) << 4) | (x2&15)
+       .word   (b2 << 12) | (\disp)
+       MRXBOPC 0, 0x0E, v1
+.endm
+
+/* VECTOR STORE MULTIPLE */
+.macro VSTM    vfrom, vto, disp, base, hint=3
+       VX_NUM  v1, \vfrom
+       VX_NUM  v3, \vto
+       GR_NUM  b2, \base
+       .word   0xE700 | ((v1&15) << 4) | (v3&15)
+       .word   (b2 << 12) | (\disp)
+       MRXBOPC \hint, 0x3E, v1, v3
+.endm
+
+/* VECTOR PERMUTE */
+.macro VPERM   vr1, vr2, vr3, vr4
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       VX_NUM  v4, \vr4
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12)
+       MRXBOPC (v4&15), 0x8C, v1, v2, v3, v4
+.endm
+
+/* VECTOR UNPACK LOGICAL LOW */
+.macro VUPLL   vr1, vr2, m3
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   0x0000
+       MRXBOPC \m3, 0xD4, v1, v2
+.endm
+.macro VUPLLB  vr1, vr2
+       VUPLL   \vr1, \vr2, 0
+.endm
+.macro VUPLLH  vr1, vr2
+       VUPLL   \vr1, \vr2, 1
+.endm
+.macro VUPLLF  vr1, vr2
+       VUPLL   \vr1, \vr2, 2
+.endm
+
+/* VECTOR PERMUTE DOUBLEWORD IMMEDIATE */
+.macro VPDI    vr1, vr2, vr3, m4
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12)
+       MRXBOPC \m4, 0x84, v1, v2, v3
+.endm
+
+/* VECTOR REPLICATE */
+.macro VREP    vr1, vr3, imm2, m4
+       VX_NUM  v1, \vr1
+       VX_NUM  v3, \vr3
+       .word   0xE700 | ((v1&15) << 4) | (v3&15)
+       .word   \imm2
+       MRXBOPC \m4, 0x4D, v1, v3
+.endm
+.macro VREPB   vr1, vr3, imm2
+       VREP    \vr1, \vr3, \imm2, 0
+.endm
+.macro VREPH   vr1, vr3, imm2
+       VREP    \vr1, \vr3, \imm2, 1
+.endm
+.macro VREPF   vr1, vr3, imm2
+       VREP    \vr1, \vr3, \imm2, 2
+.endm
+.macro VREPG   vr1, vr3, imm2
+       VREP    \vr1, \vr3, \imm2, 3
+.endm
+
+/* VECTOR MERGE HIGH */
+.macro VMRH    vr1, vr2, vr3, m4
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12)
+       MRXBOPC \m4, 0x61, v1, v2, v3
+.endm
+.macro VMRHB   vr1, vr2, vr3
+       VMRH    \vr1, \vr2, \vr3, 0
+.endm
+.macro VMRHH   vr1, vr2, vr3
+       VMRH    \vr1, \vr2, \vr3, 1
+.endm
+.macro VMRHF   vr1, vr2, vr3
+       VMRH    \vr1, \vr2, \vr3, 2
+.endm
+.macro VMRHG   vr1, vr2, vr3
+       VMRH    \vr1, \vr2, \vr3, 3
+.endm
+
+/* VECTOR MERGE LOW */
+.macro VMRL    vr1, vr2, vr3, m4
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12)
+       MRXBOPC \m4, 0x60, v1, v2, v3
+.endm
+.macro VMRLB   vr1, vr2, vr3
+       VMRL    \vr1, \vr2, \vr3, 0
+.endm
+.macro VMRLH   vr1, vr2, vr3
+       VMRL    \vr1, \vr2, \vr3, 1
+.endm
+.macro VMRLF   vr1, vr2, vr3
+       VMRL    \vr1, \vr2, \vr3, 2
+.endm
+.macro VMRLG   vr1, vr2, vr3
+       VMRL    \vr1, \vr2, \vr3, 3
+.endm
+
+
+/* Vector integer instructions */
+
+/* VECTOR AND */
+.macro VN      vr1, vr2, vr3
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12)
+       MRXBOPC 0, 0x68, v1, v2, v3
+.endm
+
+/* VECTOR EXCLUSIVE OR */
+.macro VX      vr1, vr2, vr3
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12)
+       MRXBOPC 0, 0x6D, v1, v2, v3
+.endm
+
+/* VECTOR GALOIS FIELD MULTIPLY SUM */
+.macro VGFM    vr1, vr2, vr3, m4
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12)
+       MRXBOPC \m4, 0xB4, v1, v2, v3
+.endm
+.macro VGFMB   vr1, vr2, vr3
+       VGFM    \vr1, \vr2, \vr3, 0
+.endm
+.macro VGFMH   vr1, vr2, vr3
+       VGFM    \vr1, \vr2, \vr3, 1
+.endm
+.macro VGFMF   vr1, vr2, vr3
+       VGFM    \vr1, \vr2, \vr3, 2
+.endm
+.macro VGFMG   vr1, vr2, vr3
+       VGFM    \vr1, \vr2, \vr3, 3
+.endm
+
+/* VECTOR GALOIS FIELD MULTIPLY SUM AND ACCUMULATE */
+.macro VGFMA   vr1, vr2, vr3, vr4, m5
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       VX_NUM  v4, \vr4
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12) | (\m5 << 8)
+       MRXBOPC (v4&15), 0xBC, v1, v2, v3, v4
+.endm
+.macro VGFMAB  vr1, vr2, vr3, vr4
+       VGFMA   \vr1, \vr2, \vr3, \vr4, 0
+.endm
+.macro VGFMAH  vr1, vr2, vr3, vr4
+       VGFMA   \vr1, \vr2, \vr3, \vr4, 1
+.endm
+.macro VGFMAF  vr1, vr2, vr3, vr4
+       VGFMA   \vr1, \vr2, \vr3, \vr4, 2
+.endm
+.macro VGFMAG  vr1, vr2, vr3, vr4
+       VGFMA   \vr1, \vr2, \vr3, \vr4, 3
+.endm
+
+/* VECTOR SHIFT RIGHT LOGICAL BY BYTE */
+.macro VSRLB   vr1, vr2, vr3
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12)
+       MRXBOPC 0, 0x7D, v1, v2, v3
+.endm
+
+/* VECTOR REPLICATE IMMEDIATE */
+.macro VREPI   vr1, imm2, m3
+       VX_NUM  v1, \vr1
+       .word   0xE700 | ((v1&15) << 4)
+       .word   \imm2
+       MRXBOPC \m3, 0x45, v1
+.endm
+.macro VREPIB  vr1, imm2
+       VREPI   \vr1, \imm2, 0
+.endm
+.macro VREPIH  vr1, imm2
+       VREPI   \vr1, \imm2, 1
+.endm
+.macro VREPIF  vr1, imm2
+       VREPI   \vr1, \imm2, 2
+.endm
+.macro VREPIG  vr1, imm2
+       VREP    \vr1, \imm2, 3
+.endm
+
+/* VECTOR ADD */
+.macro VA      vr1, vr2, vr3, m4
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12)
+       MRXBOPC \m4, 0xF3, v1, v2, v3
+.endm
+.macro VAB     vr1, vr2, vr3
+       VA      \vr1, \vr2, \vr3, 0
+.endm
+.macro VAH     vr1, vr2, vr3
+       VA      \vr1, \vr2, \vr3, 1
+.endm
+.macro VAF     vr1, vr2, vr3
+       VA      \vr1, \vr2, \vr3, 2
+.endm
+.macro VAG     vr1, vr2, vr3
+       VA      \vr1, \vr2, \vr3, 3
+.endm
+.macro VAQ     vr1, vr2, vr3
+       VA      \vr1, \vr2, \vr3, 4
+.endm
+
+/* VECTOR ELEMENT SHIFT RIGHT ARITHMETIC */
+.macro VESRAV  vr1, vr2, vr3, m4
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12)
+       MRXBOPC \m4, 0x7A, v1, v2, v3
+.endm
+
+.macro VESRAVB vr1, vr2, vr3
+       VESRAV  \vr1, \vr2, \vr3, 0
+.endm
+.macro VESRAVH vr1, vr2, vr3
+       VESRAV  \vr1, \vr2, \vr3, 1
+.endm
+.macro VESRAVF vr1, vr2, vr3
+       VESRAV  \vr1, \vr2, \vr3, 2
+.endm
+.macro VESRAVG vr1, vr2, vr3
+       VESRAV  \vr1, \vr2, \vr3, 3
+.endm
+
+/* VECTOR ELEMENT ROTATE LEFT LOGICAL */
+.macro VERLL   vr1, vr3, disp, base="%r0", m4
+       VX_NUM  v1, \vr1
+       VX_NUM  v3, \vr3
+       GR_NUM  b2, \base
+       .word   0xE700 | ((v1&15) << 4) | (v3&15)
+       .word   (b2 << 12) | (\disp)
+       MRXBOPC \m4, 0x33, v1, v3
+.endm
+.macro VERLLB  vr1, vr3, disp, base="%r0"
+       VERLL   \vr1, \vr3, \disp, \base, 0
+.endm
+.macro VERLLH  vr1, vr3, disp, base="%r0"
+       VERLL   \vr1, \vr3, \disp, \base, 1
+.endm
+.macro VERLLF  vr1, vr3, disp, base="%r0"
+       VERLL   \vr1, \vr3, \disp, \base, 2
+.endm
+.macro VERLLG  vr1, vr3, disp, base="%r0"
+       VERLL   \vr1, \vr3, \disp, \base, 3
+.endm
+
+/* VECTOR SHIFT LEFT DOUBLE BY BYTE */
+.macro VSLDB   vr1, vr2, vr3, imm4
+       VX_NUM  v1, \vr1
+       VX_NUM  v2, \vr2
+       VX_NUM  v3, \vr3
+       .word   0xE700 | ((v1&15) << 4) | (v2&15)
+       .word   ((v3&15) << 12) | (\imm4)
+       MRXBOPC 0, 0x77, v1, v2, v3
+.endm
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ASM_S390_FPU_INSN_ASM_H */
diff --git a/arch/s390/include/asm/fpu-insn.h b/arch/s390/include/asm/fpu-insn.h
new file mode 100644 (file)
index 0000000..32d2894
--- /dev/null
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Support for Floating Point and Vector Instructions
+ *
+ */
+
+#ifndef __ASM_S390_FPU_INSN_H
+#define __ASM_S390_FPU_INSN_H
+
+#include <asm/fpu-insn-asm.h>
+
+#ifndef __ASSEMBLY__
+
+#include <asm/asm-extable.h>
+
+asm(".include \"asm/fpu-insn-asm.h\"\n");
+
+/**
+ * sfpc_safe - Set floating point control register safely.
+ * @fpc: new value for floating point control register
+ *
+ * Set floating point control register. This may lead to an exception,
+ * since a saved value may have been modified by user space (ptrace,
+ * signal return, kvm registers) to an invalid value. In such a case
+ * set the floating point control register to zero.
+ */
+static inline void sfpc_safe(u32 fpc)
+{
+       asm volatile("\n"
+               "0:     sfpc    %[fpc]\n"
+               "1:     nopr    %%r7\n"
+               ".pushsection .fixup, \"ax\"\n"
+               "2:     lghi    %[fpc],0\n"
+               "       jg      0b\n"
+               ".popsection\n"
+               EX_TABLE(1b, 2b)
+               : [fpc] "+d" (fpc)
+               : : "memory");
+}
+
+#endif /* __ASSEMBLY__ */
+#endif /* __ASM_S390_FPU_INSN_H */
diff --git a/arch/s390/include/asm/fpu-types.h b/arch/s390/include/asm/fpu-types.h
new file mode 100644 (file)
index 0000000..1caaf31
--- /dev/null
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * FPU data structures
+ *
+ * Copyright IBM Corp. 2015
+ * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
+ */
+
+#ifndef _ASM_S390_FPU_TYPES_H
+#define _ASM_S390_FPU_TYPES_H
+
+#include <asm/sigcontext.h>
+
+struct fpu {
+       __u32 fpc;              /* Floating-point control */
+       void *regs;             /* Pointer to the current save area */
+       union {
+               /* Floating-point register save area */
+               freg_t fprs[__NUM_FPRS];
+               /* Vector register save area */
+               __vector128 vxrs[__NUM_VXRS];
+       };
+};
+
+/* VX array structure for address operand constraints in inline assemblies */
+struct vx_array {
+       __vector128 _[__NUM_VXRS];
+};
+
+/* In-kernel FPU state structure */
+struct kernel_fpu {
+       u32         mask;
+       u32         fpc;
+       union {
+               freg_t fprs[__NUM_FPRS];
+               __vector128 vxrs[__NUM_VXRS];
+       };
+};
+
+#define DECLARE_KERNEL_FPU_ONSTACK(name)       \
+       struct kernel_fpu name __uninitialized
+
+#endif /* _ASM_S390_FPU_TYPES_H */
diff --git a/arch/s390/include/asm/fpu.h b/arch/s390/include/asm/fpu.h
new file mode 100644 (file)
index 0000000..eed430c
--- /dev/null
@@ -0,0 +1,155 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * In-kernel FPU support functions
+ *
+ *
+ * Consider these guidelines before using in-kernel FPU functions:
+ *
+ *  1. Use kernel_fpu_begin() and kernel_fpu_end() to enclose all in-kernel
+ *     use of floating-point or vector registers and instructions.
+ *
+ *  2. For kernel_fpu_begin(), specify the vector register range you want to
+ *     use with the KERNEL_VXR_* constants. Consider these usage guidelines:
+ *
+ *     a) If your function typically runs in process-context, use the lower
+ *       half of the vector registers, for example, specify KERNEL_VXR_LOW.
+ *     b) If your function typically runs in soft-irq or hard-irq context,
+ *       prefer using the upper half of the vector registers, for example,
+ *       specify KERNEL_VXR_HIGH.
+ *
+ *     If you adhere to these guidelines, an interrupted process context
+ *     does not require to save and restore vector registers because of
+ *     disjoint register ranges.
+ *
+ *     Also note that the __kernel_fpu_begin()/__kernel_fpu_end() functions
+ *     includes logic to save and restore up to 16 vector registers at once.
+ *
+ *  3. You can nest kernel_fpu_begin()/kernel_fpu_end() by using different
+ *     struct kernel_fpu states.  Vector registers that are in use by outer
+ *     levels are saved and restored.  You can minimize the save and restore
+ *     effort by choosing disjoint vector register ranges.
+ *
+ *  5. To use vector floating-point instructions, specify the KERNEL_FPC
+ *     flag to save and restore floating-point controls in addition to any
+ *     vector register range.
+ *
+ *  6. To use floating-point registers and instructions only, specify the
+ *     KERNEL_FPR flag.  This flag triggers a save and restore of vector
+ *     registers V0 to V15 and floating-point controls.
+ *
+ * Copyright IBM Corp. 2015
+ * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
+ */
+
+#ifndef _ASM_S390_FPU_H
+#define _ASM_S390_FPU_H
+
+#include <linux/processor.h>
+#include <linux/preempt.h>
+#include <linux/string.h>
+#include <asm/sigcontext.h>
+#include <asm/fpu-types.h>
+#include <asm/fpu-insn.h>
+#include <asm/facility.h>
+
+static inline bool cpu_has_vx(void)
+{
+       return likely(test_facility(129));
+}
+
+void save_fpu_regs(void);
+void load_fpu_regs(void);
+void __load_fpu_regs(void);
+
+#define KERNEL_FPC             1
+#define KERNEL_VXR_V0V7                2
+#define KERNEL_VXR_V8V15       4
+#define KERNEL_VXR_V16V23      8
+#define KERNEL_VXR_V24V31      16
+
+#define KERNEL_VXR_LOW         (KERNEL_VXR_V0V7   | KERNEL_VXR_V8V15)
+#define KERNEL_VXR_MID         (KERNEL_VXR_V8V15  | KERNEL_VXR_V16V23)
+#define KERNEL_VXR_HIGH                (KERNEL_VXR_V16V23 | KERNEL_VXR_V24V31)
+
+#define KERNEL_VXR             (KERNEL_VXR_LOW    | KERNEL_VXR_HIGH)
+#define KERNEL_FPR             (KERNEL_FPC        | KERNEL_VXR_LOW)
+
+/*
+ * Note the functions below must be called with preemption disabled.
+ * Do not enable preemption before calling __kernel_fpu_end() to prevent
+ * an corruption of an existing kernel FPU state.
+ *
+ * Prefer using the kernel_fpu_begin()/kernel_fpu_end() pair of functions.
+ */
+void __kernel_fpu_begin(struct kernel_fpu *state, u32 flags);
+void __kernel_fpu_end(struct kernel_fpu *state, u32 flags);
+
+static inline void kernel_fpu_begin(struct kernel_fpu *state, u32 flags)
+{
+       preempt_disable();
+       state->mask = S390_lowcore.fpu_flags;
+       if (!test_cpu_flag(CIF_FPU)) {
+               /* Save user space FPU state and register contents */
+               save_fpu_regs();
+       } else if (state->mask & flags) {
+               /* Save FPU/vector register in-use by the kernel */
+               __kernel_fpu_begin(state, flags);
+       }
+       S390_lowcore.fpu_flags |= flags;
+}
+
+static inline void kernel_fpu_end(struct kernel_fpu *state, u32 flags)
+{
+       S390_lowcore.fpu_flags = state->mask;
+       if (state->mask & flags) {
+               /* Restore FPU/vector register in-use by the kernel */
+               __kernel_fpu_end(state, flags);
+       }
+       preempt_enable();
+}
+
+static inline void save_vx_regs(__vector128 *vxrs)
+{
+       asm volatile("\n"
+               "       la      1,%0\n"
+               "       .word   0xe70f,0x1000,0x003e\n" /* vstm 0,15,0(1) */
+               "       .word   0xe70f,0x1100,0x0c3e\n" /* vstm 16,31,256(1) */
+               : "=Q" (*(struct vx_array *)vxrs) : : "1");
+}
+
+static inline void convert_vx_to_fp(freg_t *fprs, __vector128 *vxrs)
+{
+       int i;
+
+       for (i = 0; i < __NUM_FPRS; i++)
+               fprs[i].ui = vxrs[i].high;
+}
+
+static inline void convert_fp_to_vx(__vector128 *vxrs, freg_t *fprs)
+{
+       int i;
+
+       for (i = 0; i < __NUM_FPRS; i++)
+               vxrs[i].high = fprs[i].ui;
+}
+
+static inline void fpregs_store(_s390_fp_regs *fpregs, struct fpu *fpu)
+{
+       fpregs->pad = 0;
+       fpregs->fpc = fpu->fpc;
+       if (cpu_has_vx())
+               convert_vx_to_fp((freg_t *)&fpregs->fprs, fpu->vxrs);
+       else
+               memcpy((freg_t *)&fpregs->fprs, fpu->fprs, sizeof(fpregs->fprs));
+}
+
+static inline void fpregs_load(_s390_fp_regs *fpregs, struct fpu *fpu)
+{
+       fpu->fpc = fpregs->fpc;
+       if (cpu_has_vx())
+               convert_fp_to_vx(fpu->vxrs, (freg_t *)&fpregs->fprs);
+       else
+               memcpy(fpu->fprs, (freg_t *)&fpregs->fprs, sizeof(fpregs->fprs));
+}
+
+#endif /* _ASM_S390_FPU_H */
diff --git a/arch/s390/include/asm/fpu/api.h b/arch/s390/include/asm/fpu/api.h
deleted file mode 100644 (file)
index 24da55d..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * In-kernel FPU support functions
- *
- *
- * Consider these guidelines before using in-kernel FPU functions:
- *
- *  1. Use kernel_fpu_begin() and kernel_fpu_end() to enclose all in-kernel
- *     use of floating-point or vector registers and instructions.
- *
- *  2. For kernel_fpu_begin(), specify the vector register range you want to
- *     use with the KERNEL_VXR_* constants. Consider these usage guidelines:
- *
- *     a) If your function typically runs in process-context, use the lower
- *       half of the vector registers, for example, specify KERNEL_VXR_LOW.
- *     b) If your function typically runs in soft-irq or hard-irq context,
- *       prefer using the upper half of the vector registers, for example,
- *       specify KERNEL_VXR_HIGH.
- *
- *     If you adhere to these guidelines, an interrupted process context
- *     does not require to save and restore vector registers because of
- *     disjoint register ranges.
- *
- *     Also note that the __kernel_fpu_begin()/__kernel_fpu_end() functions
- *     includes logic to save and restore up to 16 vector registers at once.
- *
- *  3. You can nest kernel_fpu_begin()/kernel_fpu_end() by using different
- *     struct kernel_fpu states.  Vector registers that are in use by outer
- *     levels are saved and restored.  You can minimize the save and restore
- *     effort by choosing disjoint vector register ranges.
- *
- *  5. To use vector floating-point instructions, specify the KERNEL_FPC
- *     flag to save and restore floating-point controls in addition to any
- *     vector register range.
- *
- *  6. To use floating-point registers and instructions only, specify the
- *     KERNEL_FPR flag.  This flag triggers a save and restore of vector
- *     registers V0 to V15 and floating-point controls.
- *
- * Copyright IBM Corp. 2015
- * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
- */
-
-#ifndef _ASM_S390_FPU_API_H
-#define _ASM_S390_FPU_API_H
-
-#include <linux/preempt.h>
-#include <asm/asm-extable.h>
-#include <asm/fpu/internal.h>
-
-void save_fpu_regs(void);
-void load_fpu_regs(void);
-void __load_fpu_regs(void);
-
-/**
- * sfpc_safe - Set floating point control register safely.
- * @fpc: new value for floating point control register
- *
- * Set floating point control register. This may lead to an exception,
- * since a saved value may have been modified by user space (ptrace,
- * signal return, kvm registers) to an invalid value. In such a case
- * set the floating point control register to zero.
- */
-static inline void sfpc_safe(u32 fpc)
-{
-       asm volatile("\n"
-               "0:     sfpc    %[fpc]\n"
-               "1:     nopr    %%r7\n"
-               ".pushsection .fixup, \"ax\"\n"
-               "2:     lghi    %[fpc],0\n"
-               "       jg      0b\n"
-               ".popsection\n"
-               EX_TABLE(1b, 2b)
-               : [fpc] "+d" (fpc)
-               : : "memory");
-}
-
-#define KERNEL_FPC             1
-#define KERNEL_VXR_V0V7                2
-#define KERNEL_VXR_V8V15       4
-#define KERNEL_VXR_V16V23      8
-#define KERNEL_VXR_V24V31      16
-
-#define KERNEL_VXR_LOW         (KERNEL_VXR_V0V7   | KERNEL_VXR_V8V15)
-#define KERNEL_VXR_MID         (KERNEL_VXR_V8V15  | KERNEL_VXR_V16V23)
-#define KERNEL_VXR_HIGH                (KERNEL_VXR_V16V23 | KERNEL_VXR_V24V31)
-
-#define KERNEL_VXR             (KERNEL_VXR_LOW    | KERNEL_VXR_HIGH)
-#define KERNEL_FPR             (KERNEL_FPC        | KERNEL_VXR_LOW)
-
-struct kernel_fpu;
-
-/*
- * Note the functions below must be called with preemption disabled.
- * Do not enable preemption before calling __kernel_fpu_end() to prevent
- * an corruption of an existing kernel FPU state.
- *
- * Prefer using the kernel_fpu_begin()/kernel_fpu_end() pair of functions.
- */
-void __kernel_fpu_begin(struct kernel_fpu *state, u32 flags);
-void __kernel_fpu_end(struct kernel_fpu *state, u32 flags);
-
-static inline void kernel_fpu_begin(struct kernel_fpu *state, u32 flags)
-{
-       preempt_disable();
-       state->mask = S390_lowcore.fpu_flags;
-       if (!test_cpu_flag(CIF_FPU)) {
-               /* Save user space FPU state and register contents */
-               save_fpu_regs();
-       } else if (state->mask & flags) {
-               /* Save FPU/vector register in-use by the kernel */
-               __kernel_fpu_begin(state, flags);
-       }
-       S390_lowcore.fpu_flags |= flags;
-}
-
-static inline void kernel_fpu_end(struct kernel_fpu *state, u32 flags)
-{
-       S390_lowcore.fpu_flags = state->mask;
-       if (state->mask & flags) {
-               /* Restore FPU/vector register in-use by the kernel */
-               __kernel_fpu_end(state, flags);
-       }
-       preempt_enable();
-}
-
-#endif /* _ASM_S390_FPU_API_H */
diff --git a/arch/s390/include/asm/fpu/internal.h b/arch/s390/include/asm/fpu/internal.h
deleted file mode 100644 (file)
index d7c0a10..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * FPU state and register content conversion primitives
- *
- * Copyright IBM Corp. 2015
- * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
- */
-
-#ifndef _ASM_S390_FPU_INTERNAL_H
-#define _ASM_S390_FPU_INTERNAL_H
-
-#include <linux/string.h>
-#include <asm/facility.h>
-#include <asm/fpu/types.h>
-
-static inline bool cpu_has_vx(void)
-{
-       return likely(test_facility(129));
-}
-
-static inline void save_vx_regs(__vector128 *vxrs)
-{
-       asm volatile("\n"
-               "       la      1,%0\n"
-               "       .word   0xe70f,0x1000,0x003e\n" /* vstm 0,15,0(1) */
-               "       .word   0xe70f,0x1100,0x0c3e\n" /* vstm 16,31,256(1) */
-               : "=Q" (*(struct vx_array *)vxrs) : : "1");
-}
-
-static inline void convert_vx_to_fp(freg_t *fprs, __vector128 *vxrs)
-{
-       int i;
-
-       for (i = 0; i < __NUM_FPRS; i++)
-               fprs[i].ui = vxrs[i].high;
-}
-
-static inline void convert_fp_to_vx(__vector128 *vxrs, freg_t *fprs)
-{
-       int i;
-
-       for (i = 0; i < __NUM_FPRS; i++)
-               vxrs[i].high = fprs[i].ui;
-}
-
-static inline void fpregs_store(_s390_fp_regs *fpregs, struct fpu *fpu)
-{
-       fpregs->pad = 0;
-       fpregs->fpc = fpu->fpc;
-       if (cpu_has_vx())
-               convert_vx_to_fp((freg_t *)&fpregs->fprs, fpu->vxrs);
-       else
-               memcpy((freg_t *)&fpregs->fprs, fpu->fprs, sizeof(fpregs->fprs));
-}
-
-static inline void fpregs_load(_s390_fp_regs *fpregs, struct fpu *fpu)
-{
-       fpu->fpc = fpregs->fpc;
-       if (cpu_has_vx())
-               convert_fp_to_vx(fpu->vxrs, (freg_t *)&fpregs->fprs);
-       else
-               memcpy(fpu->fprs, (freg_t *)&fpregs->fprs, sizeof(fpregs->fprs));
-}
-
-#endif /* _ASM_S390_FPU_INTERNAL_H */
diff --git a/arch/s390/include/asm/fpu/types.h b/arch/s390/include/asm/fpu/types.h
deleted file mode 100644 (file)
index 1caaf31..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * FPU data structures
- *
- * Copyright IBM Corp. 2015
- * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
- */
-
-#ifndef _ASM_S390_FPU_TYPES_H
-#define _ASM_S390_FPU_TYPES_H
-
-#include <asm/sigcontext.h>
-
-struct fpu {
-       __u32 fpc;              /* Floating-point control */
-       void *regs;             /* Pointer to the current save area */
-       union {
-               /* Floating-point register save area */
-               freg_t fprs[__NUM_FPRS];
-               /* Vector register save area */
-               __vector128 vxrs[__NUM_VXRS];
-       };
-};
-
-/* VX array structure for address operand constraints in inline assemblies */
-struct vx_array {
-       __vector128 _[__NUM_VXRS];
-};
-
-/* In-kernel FPU state structure */
-struct kernel_fpu {
-       u32         mask;
-       u32         fpc;
-       union {
-               freg_t fprs[__NUM_FPRS];
-               __vector128 vxrs[__NUM_VXRS];
-       };
-};
-
-#define DECLARE_KERNEL_FPU_ONSTACK(name)       \
-       struct kernel_fpu name __uninitialized
-
-#endif /* _ASM_S390_FPU_TYPES_H */
index 5266410..e336715 100644 (file)
@@ -23,7 +23,7 @@
 #include <linux/mmu_notifier.h>
 #include <asm/debug.h>
 #include <asm/cpu.h>
-#include <asm/fpu/api.h>
+#include <asm/fpu.h>
 #include <asm/isc.h>
 #include <asm/guarded_storage.h>
 
index c0b6e74..a422a2c 100644 (file)
 #include <linux/cpumask.h>
 #include <linux/linkage.h>
 #include <linux/irqflags.h>
+#include <asm/fpu-types.h>
 #include <asm/cpu.h>
 #include <asm/page.h>
 #include <asm/ptrace.h>
 #include <asm/setup.h>
 #include <asm/runtime_instr.h>
-#include <asm/fpu/types.h>
-#include <asm/fpu/internal.h>
 #include <asm/irqflags.h>
 
 typedef long (*sys_call_ptr_t)(struct pt_regs *regs);
diff --git a/arch/s390/include/asm/vx-insn-asm.h b/arch/s390/include/asm/vx-insn-asm.h
deleted file mode 100644 (file)
index 0d9f64b..0000000
+++ /dev/null
@@ -1,703 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Support for Vector Instructions
- *
- * Assembler macros to generate .byte/.word code for particular
- * vector instructions that are supported by recent binutils (>= 2.26) only.
- *
- * Copyright IBM Corp. 2015
- * Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
- */
-
-#ifndef __ASM_S390_VX_INSN_INTERNAL_H
-#define __ASM_S390_VX_INSN_INTERNAL_H
-
-#ifndef __ASM_S390_VX_INSN_H
-#error only <asm/vx-insn.h> can be included directly
-#endif
-
-#ifdef __ASSEMBLY__
-
-/* Macros to generate vector instruction byte code */
-
-/* GR_NUM - Retrieve general-purpose register number
- *
- * @opd:       Operand to store register number
- * @r64:       String designation register in the format "%rN"
- */
-.macro GR_NUM  opd gr
-       \opd = 255
-       .ifc \gr,%r0
-               \opd = 0
-       .endif
-       .ifc \gr,%r1
-               \opd = 1
-       .endif
-       .ifc \gr,%r2
-               \opd = 2
-       .endif
-       .ifc \gr,%r3
-               \opd = 3
-       .endif
-       .ifc \gr,%r4
-               \opd = 4
-       .endif
-       .ifc \gr,%r5
-               \opd = 5
-       .endif
-       .ifc \gr,%r6
-               \opd = 6
-       .endif
-       .ifc \gr,%r7
-               \opd = 7
-       .endif
-       .ifc \gr,%r8
-               \opd = 8
-       .endif
-       .ifc \gr,%r9
-               \opd = 9
-       .endif
-       .ifc \gr,%r10
-               \opd = 10
-       .endif
-       .ifc \gr,%r11
-               \opd = 11
-       .endif
-       .ifc \gr,%r12
-               \opd = 12
-       .endif
-       .ifc \gr,%r13
-               \opd = 13
-       .endif
-       .ifc \gr,%r14
-               \opd = 14
-       .endif
-       .ifc \gr,%r15
-               \opd = 15
-       .endif
-       .if \opd == 255
-               \opd = \gr
-       .endif
-.endm
-
-/* VX_NUM - Retrieve vector register number
- *
- * @opd:       Operand to store register number
- * @vxr:       String designation register in the format "%vN"
- *
- * The vector register number is used for as input number to the
- * instruction and, as well as, to compute the RXB field of the
- * instruction.
- */
-.macro VX_NUM  opd vxr
-       \opd = 255
-       .ifc \vxr,%v0
-               \opd = 0
-       .endif
-       .ifc \vxr,%v1
-               \opd = 1
-       .endif
-       .ifc \vxr,%v2
-               \opd = 2
-       .endif
-       .ifc \vxr,%v3
-               \opd = 3
-       .endif
-       .ifc \vxr,%v4
-               \opd = 4
-       .endif
-       .ifc \vxr,%v5
-               \opd = 5
-       .endif
-       .ifc \vxr,%v6
-               \opd = 6
-       .endif
-       .ifc \vxr,%v7
-               \opd = 7
-       .endif
-       .ifc \vxr,%v8
-               \opd = 8
-       .endif
-       .ifc \vxr,%v9
-               \opd = 9
-       .endif
-       .ifc \vxr,%v10
-               \opd = 10
-       .endif
-       .ifc \vxr,%v11
-               \opd = 11
-       .endif
-       .ifc \vxr,%v12
-               \opd = 12
-       .endif
-       .ifc \vxr,%v13
-               \opd = 13
-       .endif
-       .ifc \vxr,%v14
-               \opd = 14
-       .endif
-       .ifc \vxr,%v15
-               \opd = 15
-       .endif
-       .ifc \vxr,%v16
-               \opd = 16
-       .endif
-       .ifc \vxr,%v17
-               \opd = 17
-       .endif
-       .ifc \vxr,%v18
-               \opd = 18
-       .endif
-       .ifc \vxr,%v19
-               \opd = 19
-       .endif
-       .ifc \vxr,%v20
-               \opd = 20
-       .endif
-       .ifc \vxr,%v21
-               \opd = 21
-       .endif
-       .ifc \vxr,%v22
-               \opd = 22
-       .endif
-       .ifc \vxr,%v23
-               \opd = 23
-       .endif
-       .ifc \vxr,%v24
-               \opd = 24
-       .endif
-       .ifc \vxr,%v25
-               \opd = 25
-       .endif
-       .ifc \vxr,%v26
-               \opd = 26
-       .endif
-       .ifc \vxr,%v27
-               \opd = 27
-       .endif
-       .ifc \vxr,%v28
-               \opd = 28
-       .endif
-       .ifc \vxr,%v29
-               \opd = 29
-       .endif
-       .ifc \vxr,%v30
-               \opd = 30
-       .endif
-       .ifc \vxr,%v31
-               \opd = 31
-       .endif
-       .if \opd == 255
-               \opd = \vxr
-       .endif
-.endm
-
-/* RXB - Compute most significant bit used vector registers
- *
- * @rxb:       Operand to store computed RXB value
- * @v1:                Vector register designated operand whose MSB is stored in
- *             RXB bit 0 (instruction bit 36) and whose remaining bits
- *             are stored in instruction bits 8-11.
- * @v2:                Vector register designated operand whose MSB is stored in
- *             RXB bit 1 (instruction bit 37) and whose remaining bits
- *             are stored in instruction bits 12-15.
- * @v3:                Vector register designated operand whose MSB is stored in
- *             RXB bit 2 (instruction bit 38) and whose remaining bits
- *             are stored in instruction bits 16-19.
- * @v4:                Vector register designated operand whose MSB is stored in
- *             RXB bit 3 (instruction bit 39) and whose remaining bits
- *             are stored in instruction bits 32-35.
- *
- * Note: In most vector instruction formats [1] V1, V2, V3, and V4 directly
- * correspond to @v1, @v2, @v3, and @v4. But there are exceptions, such as but
- * not limited to the vector instruction formats VRR-g, VRR-h, VRS-a, VRS-d,
- * and VSI.
- *
- * [1] IBM z/Architecture Principles of Operation, chapter "Program
- * Execution, section "Instructions", subsection "Instruction Formats".
- */
-.macro RXB     rxb v1 v2=0 v3=0 v4=0
-       \rxb = 0
-       .if \v1 & 0x10
-               \rxb = \rxb | 0x08
-       .endif
-       .if \v2 & 0x10
-               \rxb = \rxb | 0x04
-       .endif
-       .if \v3 & 0x10
-               \rxb = \rxb | 0x02
-       .endif
-       .if \v4 & 0x10
-               \rxb = \rxb | 0x01
-       .endif
-.endm
-
-/* MRXB - Generate Element Size Control and RXB value
- *
- * @m:         Element size control
- * @v1:                First vector register designated operand (for RXB)
- * @v2:                Second vector register designated operand (for RXB)
- * @v3:                Third vector register designated operand (for RXB)
- * @v4:                Fourth vector register designated operand (for RXB)
- *
- * Note: For @v1, @v2, @v3, and @v4 also refer to the RXB macro
- * description for further details.
- */
-.macro MRXB    m v1 v2=0 v3=0 v4=0
-       rxb = 0
-       RXB     rxb, \v1, \v2, \v3, \v4
-       .byte   (\m << 4) | rxb
-.endm
-
-/* MRXBOPC - Generate Element Size Control, RXB, and final Opcode fields
- *
- * @m:         Element size control
- * @opc:       Opcode
- * @v1:                First vector register designated operand (for RXB)
- * @v2:                Second vector register designated operand (for RXB)
- * @v3:                Third vector register designated operand (for RXB)
- * @v4:                Fourth vector register designated operand (for RXB)
- *
- * Note: For @v1, @v2, @v3, and @v4 also refer to the RXB macro
- * description for further details.
- */
-.macro MRXBOPC m opc v1 v2=0 v3=0 v4=0
-       MRXB    \m, \v1, \v2, \v3, \v4
-       .byte   \opc
-.endm
-
-/* Vector support instructions */
-
-/* VECTOR GENERATE BYTE MASK */
-.macro VGBM    vr imm2
-       VX_NUM  v1, \vr
-       .word   (0xE700 | ((v1&15) << 4))
-       .word   \imm2
-       MRXBOPC 0, 0x44, v1
-.endm
-.macro VZERO   vxr
-       VGBM    \vxr, 0
-.endm
-.macro VONE    vxr
-       VGBM    \vxr, 0xFFFF
-.endm
-
-/* VECTOR LOAD VR ELEMENT FROM GR */
-.macro VLVG    v, gr, disp, m
-       VX_NUM  v1, \v
-       GR_NUM  b2, "%r0"
-       GR_NUM  r3, \gr
-       .word   0xE700 | ((v1&15) << 4) | r3
-       .word   (b2 << 12) | (\disp)
-       MRXBOPC \m, 0x22, v1
-.endm
-.macro VLVGB   v, gr, index, base
-       VLVG    \v, \gr, \index, \base, 0
-.endm
-.macro VLVGH   v, gr, index
-       VLVG    \v, \gr, \index, 1
-.endm
-.macro VLVGF   v, gr, index
-       VLVG    \v, \gr, \index, 2
-.endm
-.macro VLVGG   v, gr, index
-       VLVG    \v, \gr, \index, 3
-.endm
-
-/* VECTOR LOAD REGISTER */
-.macro VLR     v1, v2
-       VX_NUM  v1, \v1
-       VX_NUM  v2, \v2
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   0
-       MRXBOPC 0, 0x56, v1, v2
-.endm
-
-/* VECTOR LOAD */
-.macro VL      v, disp, index="%r0", base
-       VX_NUM  v1, \v
-       GR_NUM  x2, \index
-       GR_NUM  b2, \base
-       .word   0xE700 | ((v1&15) << 4) | x2
-       .word   (b2 << 12) | (\disp)
-       MRXBOPC 0, 0x06, v1
-.endm
-
-/* VECTOR LOAD ELEMENT */
-.macro VLEx    vr1, disp, index="%r0", base, m3, opc
-       VX_NUM  v1, \vr1
-       GR_NUM  x2, \index
-       GR_NUM  b2, \base
-       .word   0xE700 | ((v1&15) << 4) | x2
-       .word   (b2 << 12) | (\disp)
-       MRXBOPC \m3, \opc, v1
-.endm
-.macro VLEB    vr1, disp, index="%r0", base, m3
-       VLEx    \vr1, \disp, \index, \base, \m3, 0x00
-.endm
-.macro VLEH    vr1, disp, index="%r0", base, m3
-       VLEx    \vr1, \disp, \index, \base, \m3, 0x01
-.endm
-.macro VLEF    vr1, disp, index="%r0", base, m3
-       VLEx    \vr1, \disp, \index, \base, \m3, 0x03
-.endm
-.macro VLEG    vr1, disp, index="%r0", base, m3
-       VLEx    \vr1, \disp, \index, \base, \m3, 0x02
-.endm
-
-/* VECTOR LOAD ELEMENT IMMEDIATE */
-.macro VLEIx   vr1, imm2, m3, opc
-       VX_NUM  v1, \vr1
-       .word   0xE700 | ((v1&15) << 4)
-       .word   \imm2
-       MRXBOPC \m3, \opc, v1
-.endm
-.macro VLEIB   vr1, imm2, index
-       VLEIx   \vr1, \imm2, \index, 0x40
-.endm
-.macro VLEIH   vr1, imm2, index
-       VLEIx   \vr1, \imm2, \index, 0x41
-.endm
-.macro VLEIF   vr1, imm2, index
-       VLEIx   \vr1, \imm2, \index, 0x43
-.endm
-.macro VLEIG   vr1, imm2, index
-       VLEIx   \vr1, \imm2, \index, 0x42
-.endm
-
-/* VECTOR LOAD GR FROM VR ELEMENT */
-.macro VLGV    gr, vr, disp, base="%r0", m
-       GR_NUM  r1, \gr
-       GR_NUM  b2, \base
-       VX_NUM  v3, \vr
-       .word   0xE700 | (r1 << 4) | (v3&15)
-       .word   (b2 << 12) | (\disp)
-       MRXBOPC \m, 0x21, 0, v3
-.endm
-.macro VLGVB   gr, vr, disp, base="%r0"
-       VLGV    \gr, \vr, \disp, \base, 0
-.endm
-.macro VLGVH   gr, vr, disp, base="%r0"
-       VLGV    \gr, \vr, \disp, \base, 1
-.endm
-.macro VLGVF   gr, vr, disp, base="%r0"
-       VLGV    \gr, \vr, \disp, \base, 2
-.endm
-.macro VLGVG   gr, vr, disp, base="%r0"
-       VLGV    \gr, \vr, \disp, \base, 3
-.endm
-
-/* VECTOR LOAD MULTIPLE */
-.macro VLM     vfrom, vto, disp, base, hint=3
-       VX_NUM  v1, \vfrom
-       VX_NUM  v3, \vto
-       GR_NUM  b2, \base
-       .word   0xE700 | ((v1&15) << 4) | (v3&15)
-       .word   (b2 << 12) | (\disp)
-       MRXBOPC \hint, 0x36, v1, v3
-.endm
-
-/* VECTOR STORE */
-.macro VST     vr1, disp, index="%r0", base
-       VX_NUM  v1, \vr1
-       GR_NUM  x2, \index
-       GR_NUM  b2, \base
-       .word   0xE700 | ((v1&15) << 4) | (x2&15)
-       .word   (b2 << 12) | (\disp)
-       MRXBOPC 0, 0x0E, v1
-.endm
-
-/* VECTOR STORE MULTIPLE */
-.macro VSTM    vfrom, vto, disp, base, hint=3
-       VX_NUM  v1, \vfrom
-       VX_NUM  v3, \vto
-       GR_NUM  b2, \base
-       .word   0xE700 | ((v1&15) << 4) | (v3&15)
-       .word   (b2 << 12) | (\disp)
-       MRXBOPC \hint, 0x3E, v1, v3
-.endm
-
-/* VECTOR PERMUTE */
-.macro VPERM   vr1, vr2, vr3, vr4
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       VX_NUM  v4, \vr4
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12)
-       MRXBOPC (v4&15), 0x8C, v1, v2, v3, v4
-.endm
-
-/* VECTOR UNPACK LOGICAL LOW */
-.macro VUPLL   vr1, vr2, m3
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   0x0000
-       MRXBOPC \m3, 0xD4, v1, v2
-.endm
-.macro VUPLLB  vr1, vr2
-       VUPLL   \vr1, \vr2, 0
-.endm
-.macro VUPLLH  vr1, vr2
-       VUPLL   \vr1, \vr2, 1
-.endm
-.macro VUPLLF  vr1, vr2
-       VUPLL   \vr1, \vr2, 2
-.endm
-
-/* VECTOR PERMUTE DOUBLEWORD IMMEDIATE */
-.macro VPDI    vr1, vr2, vr3, m4
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12)
-       MRXBOPC \m4, 0x84, v1, v2, v3
-.endm
-
-/* VECTOR REPLICATE */
-.macro VREP    vr1, vr3, imm2, m4
-       VX_NUM  v1, \vr1
-       VX_NUM  v3, \vr3
-       .word   0xE700 | ((v1&15) << 4) | (v3&15)
-       .word   \imm2
-       MRXBOPC \m4, 0x4D, v1, v3
-.endm
-.macro VREPB   vr1, vr3, imm2
-       VREP    \vr1, \vr3, \imm2, 0
-.endm
-.macro VREPH   vr1, vr3, imm2
-       VREP    \vr1, \vr3, \imm2, 1
-.endm
-.macro VREPF   vr1, vr3, imm2
-       VREP    \vr1, \vr3, \imm2, 2
-.endm
-.macro VREPG   vr1, vr3, imm2
-       VREP    \vr1, \vr3, \imm2, 3
-.endm
-
-/* VECTOR MERGE HIGH */
-.macro VMRH    vr1, vr2, vr3, m4
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12)
-       MRXBOPC \m4, 0x61, v1, v2, v3
-.endm
-.macro VMRHB   vr1, vr2, vr3
-       VMRH    \vr1, \vr2, \vr3, 0
-.endm
-.macro VMRHH   vr1, vr2, vr3
-       VMRH    \vr1, \vr2, \vr3, 1
-.endm
-.macro VMRHF   vr1, vr2, vr3
-       VMRH    \vr1, \vr2, \vr3, 2
-.endm
-.macro VMRHG   vr1, vr2, vr3
-       VMRH    \vr1, \vr2, \vr3, 3
-.endm
-
-/* VECTOR MERGE LOW */
-.macro VMRL    vr1, vr2, vr3, m4
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12)
-       MRXBOPC \m4, 0x60, v1, v2, v3
-.endm
-.macro VMRLB   vr1, vr2, vr3
-       VMRL    \vr1, \vr2, \vr3, 0
-.endm
-.macro VMRLH   vr1, vr2, vr3
-       VMRL    \vr1, \vr2, \vr3, 1
-.endm
-.macro VMRLF   vr1, vr2, vr3
-       VMRL    \vr1, \vr2, \vr3, 2
-.endm
-.macro VMRLG   vr1, vr2, vr3
-       VMRL    \vr1, \vr2, \vr3, 3
-.endm
-
-
-/* Vector integer instructions */
-
-/* VECTOR AND */
-.macro VN      vr1, vr2, vr3
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12)
-       MRXBOPC 0, 0x68, v1, v2, v3
-.endm
-
-/* VECTOR EXCLUSIVE OR */
-.macro VX      vr1, vr2, vr3
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12)
-       MRXBOPC 0, 0x6D, v1, v2, v3
-.endm
-
-/* VECTOR GALOIS FIELD MULTIPLY SUM */
-.macro VGFM    vr1, vr2, vr3, m4
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12)
-       MRXBOPC \m4, 0xB4, v1, v2, v3
-.endm
-.macro VGFMB   vr1, vr2, vr3
-       VGFM    \vr1, \vr2, \vr3, 0
-.endm
-.macro VGFMH   vr1, vr2, vr3
-       VGFM    \vr1, \vr2, \vr3, 1
-.endm
-.macro VGFMF   vr1, vr2, vr3
-       VGFM    \vr1, \vr2, \vr3, 2
-.endm
-.macro VGFMG   vr1, vr2, vr3
-       VGFM    \vr1, \vr2, \vr3, 3
-.endm
-
-/* VECTOR GALOIS FIELD MULTIPLY SUM AND ACCUMULATE */
-.macro VGFMA   vr1, vr2, vr3, vr4, m5
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       VX_NUM  v4, \vr4
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12) | (\m5 << 8)
-       MRXBOPC (v4&15), 0xBC, v1, v2, v3, v4
-.endm
-.macro VGFMAB  vr1, vr2, vr3, vr4
-       VGFMA   \vr1, \vr2, \vr3, \vr4, 0
-.endm
-.macro VGFMAH  vr1, vr2, vr3, vr4
-       VGFMA   \vr1, \vr2, \vr3, \vr4, 1
-.endm
-.macro VGFMAF  vr1, vr2, vr3, vr4
-       VGFMA   \vr1, \vr2, \vr3, \vr4, 2
-.endm
-.macro VGFMAG  vr1, vr2, vr3, vr4
-       VGFMA   \vr1, \vr2, \vr3, \vr4, 3
-.endm
-
-/* VECTOR SHIFT RIGHT LOGICAL BY BYTE */
-.macro VSRLB   vr1, vr2, vr3
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12)
-       MRXBOPC 0, 0x7D, v1, v2, v3
-.endm
-
-/* VECTOR REPLICATE IMMEDIATE */
-.macro VREPI   vr1, imm2, m3
-       VX_NUM  v1, \vr1
-       .word   0xE700 | ((v1&15) << 4)
-       .word   \imm2
-       MRXBOPC \m3, 0x45, v1
-.endm
-.macro VREPIB  vr1, imm2
-       VREPI   \vr1, \imm2, 0
-.endm
-.macro VREPIH  vr1, imm2
-       VREPI   \vr1, \imm2, 1
-.endm
-.macro VREPIF  vr1, imm2
-       VREPI   \vr1, \imm2, 2
-.endm
-.macro VREPIG  vr1, imm2
-       VREP    \vr1, \imm2, 3
-.endm
-
-/* VECTOR ADD */
-.macro VA      vr1, vr2, vr3, m4
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12)
-       MRXBOPC \m4, 0xF3, v1, v2, v3
-.endm
-.macro VAB     vr1, vr2, vr3
-       VA      \vr1, \vr2, \vr3, 0
-.endm
-.macro VAH     vr1, vr2, vr3
-       VA      \vr1, \vr2, \vr3, 1
-.endm
-.macro VAF     vr1, vr2, vr3
-       VA      \vr1, \vr2, \vr3, 2
-.endm
-.macro VAG     vr1, vr2, vr3
-       VA      \vr1, \vr2, \vr3, 3
-.endm
-.macro VAQ     vr1, vr2, vr3
-       VA      \vr1, \vr2, \vr3, 4
-.endm
-
-/* VECTOR ELEMENT SHIFT RIGHT ARITHMETIC */
-.macro VESRAV  vr1, vr2, vr3, m4
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12)
-       MRXBOPC \m4, 0x7A, v1, v2, v3
-.endm
-
-.macro VESRAVB vr1, vr2, vr3
-       VESRAV  \vr1, \vr2, \vr3, 0
-.endm
-.macro VESRAVH vr1, vr2, vr3
-       VESRAV  \vr1, \vr2, \vr3, 1
-.endm
-.macro VESRAVF vr1, vr2, vr3
-       VESRAV  \vr1, \vr2, \vr3, 2
-.endm
-.macro VESRAVG vr1, vr2, vr3
-       VESRAV  \vr1, \vr2, \vr3, 3
-.endm
-
-/* VECTOR ELEMENT ROTATE LEFT LOGICAL */
-.macro VERLL   vr1, vr3, disp, base="%r0", m4
-       VX_NUM  v1, \vr1
-       VX_NUM  v3, \vr3
-       GR_NUM  b2, \base
-       .word   0xE700 | ((v1&15) << 4) | (v3&15)
-       .word   (b2 << 12) | (\disp)
-       MRXBOPC \m4, 0x33, v1, v3
-.endm
-.macro VERLLB  vr1, vr3, disp, base="%r0"
-       VERLL   \vr1, \vr3, \disp, \base, 0
-.endm
-.macro VERLLH  vr1, vr3, disp, base="%r0"
-       VERLL   \vr1, \vr3, \disp, \base, 1
-.endm
-.macro VERLLF  vr1, vr3, disp, base="%r0"
-       VERLL   \vr1, \vr3, \disp, \base, 2
-.endm
-.macro VERLLG  vr1, vr3, disp, base="%r0"
-       VERLL   \vr1, \vr3, \disp, \base, 3
-.endm
-
-/* VECTOR SHIFT LEFT DOUBLE BY BYTE */
-.macro VSLDB   vr1, vr2, vr3, imm4
-       VX_NUM  v1, \vr1
-       VX_NUM  v2, \vr2
-       VX_NUM  v3, \vr3
-       .word   0xE700 | ((v1&15) << 4) | (v2&15)
-       .word   ((v3&15) << 12) | (\imm4)
-       MRXBOPC 0, 0x77, v1, v2, v3
-.endm
-
-#endif /* __ASSEMBLY__ */
-#endif /* __ASM_S390_VX_INSN_INTERNAL_H */
diff --git a/arch/s390/include/asm/vx-insn.h b/arch/s390/include/asm/vx-insn.h
deleted file mode 100644 (file)
index 8c188f1..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Support for Vector Instructions
- *
- * This wrapper header file allows to use the vector instruction macros in
- * both assembler files as well as in inline assemblies in C files.
- */
-
-#ifndef __ASM_S390_VX_INSN_H
-#define __ASM_S390_VX_INSN_H
-
-#include <asm/vx-insn-asm.h>
-
-#ifndef __ASSEMBLY__
-
-asm(".include \"asm/vx-insn-asm.h\"\n");
-
-#endif /* __ASSEMBLY__ */
-#endif /* __ASM_S390_VX_INSN_H */
index 13f41cb..6cd9bf9 100644 (file)
@@ -29,7 +29,7 @@
 #include <linux/uaccess.h>
 #include <asm/lowcore.h>
 #include <asm/vdso.h>
-#include <asm/fpu/api.h>
+#include <asm/fpu.h>
 #include "compat_linux.h"
 #include "compat_ptrace.h"
 #include "entry.h"
index 5c46c26..d09ebb6 100644 (file)
@@ -22,7 +22,7 @@
 #include <asm/ipl.h>
 #include <asm/sclp.h>
 #include <asm/maccess.h>
-#include <asm/fpu/api.h>
+#include <asm/fpu.h>
 
 #define PTR_ADD(x, y) (((char *) (x)) + ((unsigned long) (y)))
 #define PTR_SUB(x, y) (((char *) (x)) - ((unsigned long) (y)))
index 63d5b51..c666271 100644 (file)
@@ -20,9 +20,9 @@
 #include <asm/asm-extable.h>
 #include <linux/memblock.h>
 #include <asm/access-regs.h>
-#include <asm/fpu/api.h>
 #include <asm/diag.h>
 #include <asm/ebcdic.h>
+#include <asm/fpu.h>
 #include <asm/ipl.h>
 #include <asm/lowcore.h>
 #include <asm/processor.h>
index c6ccfc9..01c3b2d 100644 (file)
@@ -24,7 +24,7 @@
 #include <asm/page.h>
 #include <asm/sigp.h>
 #include <asm/irq.h>
-#include <asm/vx-insn.h>
+#include <asm/fpu-insn.h>
 #include <asm/setup.h>
 #include <asm/nmi.h>
 #include <asm/nospec-insn.h>
index d8e18a7..5d6a233 100644 (file)
@@ -8,9 +8,7 @@
 #include <linux/kernel.h>
 #include <linux/cpu.h>
 #include <linux/sched.h>
-#include <asm/fpu/types.h>
-#include <asm/fpu/api.h>
-#include <asm/vx-insn.h>
+#include <asm/fpu.h>
 
 void __kernel_fpu_begin(struct kernel_fpu *state, u32 flags)
 {
index 032a112..c5d0c1c 100644 (file)
@@ -16,6 +16,7 @@
 #include <asm/guarded_storage.h>
 #include <asm/pfault.h>
 #include <asm/cio.h>
+#include <asm/fpu.h>
 #include <asm/setup.h>
 #include <asm/smp.h>
 #include <asm/ipl.h>
index 6dd3020..c77382a 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/export.h>
 #include <asm/lowcore.h>
 #include <asm/ctlreg.h>
+#include <asm/fpu.h>
 #include <asm/smp.h>
 #include <asm/stp.h>
 #include <asm/cputime.h>
@@ -30,8 +31,6 @@
 #include <asm/crw.h>
 #include <asm/asm-offsets.h>
 #include <asm/pai.h>
-#include <asm/vx-insn.h>
-#include <asm/fpu/api.h>
 
 struct mcck_struct {
        unsigned int kill_task : 1;
index 3d93656..c8e8fb7 100644 (file)
@@ -5,8 +5,7 @@
 #include <linux/errno.h>
 #include <linux/bug.h>
 #include <asm/ptrace.h>
-#include <asm/fpu/api.h>
-#include <asm/fpu/types.h>
+#include <asm/fpu.h>
 
 u64 perf_reg_value(struct pt_regs *regs, int idx)
 {
index 7227a73..e502192 100644 (file)
@@ -39,6 +39,7 @@
 #include <asm/ptrace.h>
 #include <asm/vtimer.h>
 #include <asm/exec.h>
+#include <asm/fpu.h>
 #include <asm/irq.h>
 #include <asm/nmi.h>
 #include <asm/smp.h>
index 7c5e99b..2eafd6d 100644 (file)
@@ -31,7 +31,7 @@
 #include <asm/unistd.h>
 #include <asm/runtime_instr.h>
 #include <asm/facility.h>
-#include <asm/fpu/api.h>
+#include <asm/fpu.h>
 
 #include "entry.h"
 
index f77a54e..0324649 100644 (file)
@@ -42,6 +42,7 @@
 #include <asm/pfault.h>
 #include <asm/diag.h>
 #include <asm/facility.h>
+#include <asm/fpu.h>
 #include <asm/ipl.h>
 #include <asm/setup.h>
 #include <asm/irq.h>
index b439f17..061d45c 100644 (file)
@@ -20,7 +20,7 @@
 #include <asm/sysinfo.h>
 #include <asm/cpcmd.h>
 #include <asm/topology.h>
-#include <asm/fpu/api.h>
+#include <asm/fpu.h>
 
 int topology_max_mnest;
 
index 46dac45..08f8aee 100644 (file)
@@ -28,8 +28,8 @@
 #include <linux/cpu.h>
 #include <linux/entry-common.h>
 #include <asm/asm-extable.h>
-#include <asm/fpu/api.h>
 #include <asm/vtime.h>
+#include <asm/fpu.h>
 #include "entry.h"
 
 static inline void __user *get_trap_ip(struct pt_regs *regs)
index 6eab70b..8f44145 100644 (file)
@@ -43,9 +43,9 @@
 #include <asm/sclp.h>
 #include <asm/cpacf.h>
 #include <asm/timex.h>
+#include <asm/fpu.h>
 #include <asm/ap.h>
 #include <asm/uv.h>
-#include <asm/fpu/api.h>
 #include "kvm-s390.h"
 #include "gaccess.h"
 #include "pci.h"
index fef42e2..457d92c 100644 (file)
@@ -18,7 +18,7 @@
 #include <asm/sclp.h>
 #include <asm/nmi.h>
 #include <asm/dis.h>
-#include <asm/fpu/api.h>
+#include <asm/fpu.h>
 #include <asm/facility.h>
 #include "kvm-s390.h"
 #include "gaccess.h"
index 7b0b355..bc2f4fb 100644 (file)
@@ -12,8 +12,7 @@
  */
 
 #include <linux/raid/pq.h>
-#include <asm/fpu/api.h>
-#include <asm/vx-insn.h>
+#include <asm/fpu.h>
 
 #define NSIZE 16