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

Commit 4cfb3613 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Catalin Marinas
Browse files

arm64: add support for kernel mode NEON



Add <asm/neon.h> containing kernel_neon_begin/kernel_neon_end function
declarations and corresponding definitions in fpsimd.c

These are needed to wrap uses of NEON in kernel mode. The names are
identical to the ones used in arm/ so code using intrinsics or
vectorized by GCC can be shared between arm and arm64.

Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 178cd9ce
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -96,6 +96,9 @@ config SWIOTLB
config IOMMU_HELPER
config IOMMU_HELPER
	def_bool SWIOTLB
	def_bool SWIOTLB


config KERNEL_MODE_NEON
	def_bool y

source "init/Kconfig"
source "init/Kconfig"


source "kernel/Kconfig.freezer"
source "kernel/Kconfig.freezer"
+14 −0
Original line number Original line Diff line number Diff line
/*
 * linux/arch/arm64/include/asm/neon.h
 *
 * Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#define cpu_has_neon()		(1)

void kernel_neon_begin(void);
void kernel_neon_end(void);
+28 −0
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@
#include <linux/init.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/sched.h>
#include <linux/signal.h>
#include <linux/signal.h>
#include <linux/hardirq.h>


#include <asm/fpsimd.h>
#include <asm/fpsimd.h>
#include <asm/cputype.h>
#include <asm/cputype.h>
@@ -83,6 +84,33 @@ void fpsimd_flush_thread(void)
	fpsimd_load_state(&current->thread.fpsimd_state);
	fpsimd_load_state(&current->thread.fpsimd_state);
}
}


#ifdef CONFIG_KERNEL_MODE_NEON

/*
 * Kernel-side NEON support functions
 */
void kernel_neon_begin(void)
{
	/* Avoid using the NEON in interrupt context */
	BUG_ON(in_interrupt());
	preempt_disable();

	if (current->mm)
		fpsimd_save_state(&current->thread.fpsimd_state);
}
EXPORT_SYMBOL(kernel_neon_begin);

void kernel_neon_end(void)
{
	if (current->mm)
		fpsimd_load_state(&current->thread.fpsimd_state);

	preempt_enable();
}
EXPORT_SYMBOL(kernel_neon_end);

#endif /* CONFIG_KERNEL_MODE_NEON */

/*
/*
 * FP/SIMD support code initialisation.
 * FP/SIMD support code initialisation.
 */
 */