Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a7ba38d6 authored by Catalin Marinas's avatar Catalin Marinas
Browse files

Merge branch 'for-next/kernel-mode-neon' into for-next/core

* for-next/kernel-mode-neon:
  arm64: neon/efi: Make EFI fpsimd save/restore variables static
  arm64: neon: Forbid when irqs are disabled
  arm64: neon: Export kernel_neon_busy to loadable modules
  arm64: neon: Temporarily add a kernel_mode_begin_partial() definition
  arm64: neon: Remove support for nested or hardirq kernel-mode NEON
  arm64: neon: Allow EFI runtime services to use FPSIMD in irq context
  arm64: fpsimd: Consistently use __this_cpu_ ops where appropriate
  arm64: neon: Add missing header guard in <asm/neon.h>
  arm64: neon: replace generic definition of may_use_simd()
parents cda94408 3b66023d
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -20,7 +20,6 @@ generic-y += rwsem.h
generic-y += segment.h
generic-y += serial.h
generic-y += set_memory.h
generic-y += simd.h
generic-y += sizes.h
generic-y += switch_to.h
generic-y += trace_clock.h
+3 −2
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@

#include <asm/boot.h>
#include <asm/cpufeature.h>
#include <asm/fpsimd.h>
#include <asm/io.h>
#include <asm/memory.h>
#include <asm/mmu_context.h>
@@ -21,8 +22,8 @@ int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md);

#define arch_efi_call_virt_setup()					\
({									\
	kernel_neon_begin();						\
	efi_virtmap_load();						\
	__efi_fpsimd_begin();						\
})

#define arch_efi_call_virt(p, f, args...)				\
@@ -34,8 +35,8 @@ int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md);

#define arch_efi_call_virt_teardown()					\
({									\
	__efi_fpsimd_end();						\
	efi_virtmap_unload();						\
	kernel_neon_end();						\
})

#define ARCH_EFI_IRQ_FLAGS_MASK (PSR_D_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT)
+3 −13
Original line number Diff line number Diff line
@@ -41,16 +41,6 @@ struct fpsimd_state {
	unsigned int cpu;
};

/*
 * Struct for stacking the bottom 'n' FP/SIMD registers.
 */
struct fpsimd_partial_state {
	u32		fpsr;
	u32		fpcr;
	u32		num_regs;
	__uint128_t	vregs[32];
};


#if defined(__KERNEL__) && defined(CONFIG_COMPAT)
/* Masks for extracting the FPSR and FPCR from the FPSCR */
@@ -77,9 +67,9 @@ extern void fpsimd_update_current_state(struct fpsimd_state *state);

extern void fpsimd_flush_task_state(struct task_struct *target);

extern void fpsimd_save_partial_state(struct fpsimd_partial_state *state,
				      u32 num_regs);
extern void fpsimd_load_partial_state(struct fpsimd_partial_state *state);
/* For use by EFI runtime services calls only */
extern void __efi_fpsimd_begin(void);
extern void __efi_fpsimd_end(void);

#endif

+0 −56
Original line number Diff line number Diff line
@@ -75,59 +75,3 @@
	ldr	w\tmpnr, [\state, #16 * 2 + 4]
	fpsimd_restore_fpcr x\tmpnr, \state
.endm

.macro fpsimd_save_partial state, numnr, tmpnr1, tmpnr2
	mrs	x\tmpnr1, fpsr
	str	w\numnr, [\state, #8]
	mrs	x\tmpnr2, fpcr
	stp	w\tmpnr1, w\tmpnr2, [\state]
	adr	x\tmpnr1, 0f
	add	\state, \state, x\numnr, lsl #4
	sub	x\tmpnr1, x\tmpnr1, x\numnr, lsl #1
	br	x\tmpnr1
	stp	q30, q31, [\state, #-16 * 30 - 16]
	stp	q28, q29, [\state, #-16 * 28 - 16]
	stp	q26, q27, [\state, #-16 * 26 - 16]
	stp	q24, q25, [\state, #-16 * 24 - 16]
	stp	q22, q23, [\state, #-16 * 22 - 16]
	stp	q20, q21, [\state, #-16 * 20 - 16]
	stp	q18, q19, [\state, #-16 * 18 - 16]
	stp	q16, q17, [\state, #-16 * 16 - 16]
	stp	q14, q15, [\state, #-16 * 14 - 16]
	stp	q12, q13, [\state, #-16 * 12 - 16]
	stp	q10, q11, [\state, #-16 * 10 - 16]
	stp	q8, q9, [\state, #-16 * 8 - 16]
	stp	q6, q7, [\state, #-16 * 6 - 16]
	stp	q4, q5, [\state, #-16 * 4 - 16]
	stp	q2, q3, [\state, #-16 * 2 - 16]
	stp	q0, q1, [\state, #-16 * 0 - 16]
0:
.endm

.macro fpsimd_restore_partial state, tmpnr1, tmpnr2
	ldp	w\tmpnr1, w\tmpnr2, [\state]
	msr	fpsr, x\tmpnr1
	fpsimd_restore_fpcr x\tmpnr2, x\tmpnr1
	adr	x\tmpnr1, 0f
	ldr	w\tmpnr2, [\state, #8]
	add	\state, \state, x\tmpnr2, lsl #4
	sub	x\tmpnr1, x\tmpnr1, x\tmpnr2, lsl #1
	br	x\tmpnr1
	ldp	q30, q31, [\state, #-16 * 30 - 16]
	ldp	q28, q29, [\state, #-16 * 28 - 16]
	ldp	q26, q27, [\state, #-16 * 26 - 16]
	ldp	q24, q25, [\state, #-16 * 24 - 16]
	ldp	q22, q23, [\state, #-16 * 22 - 16]
	ldp	q20, q21, [\state, #-16 * 20 - 16]
	ldp	q18, q19, [\state, #-16 * 18 - 16]
	ldp	q16, q17, [\state, #-16 * 16 - 16]
	ldp	q14, q15, [\state, #-16 * 14 - 16]
	ldp	q12, q13, [\state, #-16 * 12 - 16]
	ldp	q10, q11, [\state, #-16 * 10 - 16]
	ldp	q8, q9, [\state, #-16 * 8 - 16]
	ldp	q6, q7, [\state, #-16 * 6 - 16]
	ldp	q4, q5, [\state, #-16 * 4 - 16]
	ldp	q2, q3, [\state, #-16 * 2 - 16]
	ldp	q0, q1, [\state, #-16 * 0 - 16]
0:
.endm
+13 −3
Original line number Diff line number Diff line
@@ -8,12 +8,22 @@
 * published by the Free Software Foundation.
 */

#ifndef __ASM_NEON_H
#define __ASM_NEON_H

#include <linux/types.h>
#include <asm/fpsimd.h>

#define cpu_has_neon()		system_supports_fpsimd()

#define kernel_neon_begin()	kernel_neon_begin_partial(32)

void kernel_neon_begin_partial(u32 num_regs);
void kernel_neon_begin(void);
void kernel_neon_end(void);

/*
 * Temporary macro to allow the crypto code to compile. Note that the
 * semantics of kernel_neon_begin_partial() are now different from the
 * original as it does not allow being called in an interrupt context.
 */
#define kernel_neon_begin_partial(num_regs)	kernel_neon_begin()

#endif /* ! __ASM_NEON_H */
Loading