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 a823132fc5639b70cb8c0005936e782c563f2158..97098add2079136267e61f7a3eebf6f488de4240 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 37cb63f25b17697e1396ee95a3f366ba8e38bc36..63f3102678c0840113194206425fb8a46751abf4 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 6ae3e3ff5b0ae799d1c9d10e1b664977f7b21d1a..dc2997f18e30593245577aa510220bfc0c4024f0 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 34ee4792689188847bf9868e829239391306f9ae..f2dc8a688afb894bc6125d5c43db90b121e1010b 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 5a819ae09a0b9a0933fe63b63ac791eb44803b91..df19e06ff8bcb6b70294f7b7094ab460ab852cb0 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 a873e873e1ee4bdf11c1ff813afcc5129fd09fd7..56096ae26f296b22a350592d6c354ea83e03a359 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 fdd319a622b065c1a96bcbd0b03fbe83e8d4c17e..a1dbab19c0bd0f68488cb5d159eac89ea3a9c0b1 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 52664105a473f97b923fb104c2e0c279b4b02cef..e336715eb7d2e4cf991e226fb9013f347abde685 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 c0b6e74d899a495d4579c1ea60f6e4d72e33921c..a422a2cf9d05bc9cf34cecc07b2f5c6e1b560a4d 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 13f41cb497beb337485d8114ea9b18e77402f94e..6cd9bf925c82876779df74a0c88baab9ffb0638c 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 5c46c26593054a679e9cddd74885d7cfd67d540a..d09ebb6f52625ef6b5021131cc18faedc75ca374 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 63d5b51cb45a474f3a857d3bab4ec3d6be7bd708..c666271433fb0ff38421be7f55393daf9302f769 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 c6ccfc9d3704d2a0358864da73592da477f20cf8..01c3b2d2821df7adcb610c775fae0669e146c22f 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 d8e18a74b93dbc1fa8c6d0ce71564c03579abcd9..5d6a2339db40fb8fdf60ca82059297c145c46470 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 032a1124f04bca9019e86f0cf9b7e1a46ba46370..c5d0c1cf984bb8e2bb0014bc4f695a72e34afd5f 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 6dd3020d4a2fc43e45d560cbc40c64806cde79ff..c77382a673257abcdae4c64fe03a94f0aedfb0f0 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 3d93656bd94890f4a5209e2eb9e76deb35e25d1d..c8e8fb728ddbf8620dbd154dbf47c5550e277a18 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 7227a73226f18b289ff0ebefb21b73fccb902c03..e502192da5f7938903b1a4c133c48df90dfe8fba 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 7c5e99be2155af58187c3b0dfd77fe90a7f36cce..2eafd6dcd592144a66a6165fdddaa6e601a7b6b2 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 f77a54e1e4bdce4be7f7f5a698d2c6295ee66dfe..0324649aae0a3e7348639bb1c33fb22fc19be783 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 b439f17516ebc9f105af7c861b6b5c110411f795..061d45cf02618d5a8434f121c7a543c9bdf34f3e 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 46dac4540ca8e1ee8e72e1ae399a955f13644cf4..08f8aee96d8f43faa86162c6e166412c48785963 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 6eab70b19abfc8d0be946d1dabf0617d891f503a..8f44145397567bb653750c0f97791edab3c00cd7 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 fef42e2a80a2ae5bc47eae89f2b4e38293a2586b..457d92c2949ab7f838d4fa8d4ef945e474358263 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 7b0b355e1a26041ab47c8784b6855c9a06dba406..bc2f4fbe5a8280107068a82e1f1741dc22173b1f 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