Commit f9209e26 authored by Mark Rutland's avatar Mark Rutland Committed by Will Deacon

arm64: move sve_user_{enable,disable} to <asm/fpsimd.h>

In subsequent patches, we'll want to make use of sve_user_enable() and
sve_user_disable() outside of kernel/fpsimd.c. Let's move these to
<asm/fpsimd.h> where we can make use of them.

To avoid ifdeffery in sequences like:

if (system_supports_sve() && some_condition)
	sve_user_disable();

... empty stubs are provided when support for SVE is not enabled. Note
that system_supports_sve() contains as IS_ENABLED(CONFIG_ARM64_SVE), so
the sve_user_disable() call should be optimized away entirely when
CONFIG_ARM64_SVE is not selected.

To ensure that this is the case, the stub definitions contain a
BUILD_BUG(), as we do for other stubs for which calls should always be
optimized away when the relevant config option is not selected.

At the same time, the include list of <asm/fpsimd.h> is sorted while
adding <asm/sysreg.h>.
Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Reviewed-by: default avatarDave Martin <dave.martin@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 8d370933
...@@ -16,13 +16,15 @@ ...@@ -16,13 +16,15 @@
#ifndef __ASM_FP_H #ifndef __ASM_FP_H
#define __ASM_FP_H #define __ASM_FP_H
#include <asm/ptrace.h>
#include <asm/errno.h> #include <asm/errno.h>
#include <asm/ptrace.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#include <asm/sysreg.h>
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <linux/build_bug.h>
#include <linux/cache.h> #include <linux/cache.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/stddef.h> #include <linux/stddef.h>
...@@ -102,6 +104,16 @@ extern int sve_set_vector_length(struct task_struct *task, ...@@ -102,6 +104,16 @@ extern int sve_set_vector_length(struct task_struct *task,
extern int sve_set_current_vl(unsigned long arg); extern int sve_set_current_vl(unsigned long arg);
extern int sve_get_current_vl(void); extern int sve_get_current_vl(void);
static inline void sve_user_disable(void)
{
sysreg_clear_set(cpacr_el1, CPACR_EL1_ZEN_EL0EN, 0);
}
static inline void sve_user_enable(void)
{
sysreg_clear_set(cpacr_el1, 0, CPACR_EL1_ZEN_EL0EN);
}
/* /*
* Probing and setup functions. * Probing and setup functions.
* Calls to these functions must be serialised with one another. * Calls to these functions must be serialised with one another.
...@@ -128,6 +140,9 @@ static inline int sve_get_current_vl(void) ...@@ -128,6 +140,9 @@ static inline int sve_get_current_vl(void)
return -EINVAL; return -EINVAL;
} }
static inline void sve_user_disable(void) { BUILD_BUG(); }
static inline void sve_user_enable(void) { BUILD_BUG(); }
static inline void sve_init_vq_map(void) { } static inline void sve_init_vq_map(void) { }
static inline void sve_update_vq_map(void) { } static inline void sve_update_vq_map(void) { }
static inline int sve_verify_vq_map(void) { return 0; } static inline int sve_verify_vq_map(void) { return 0; }
......
...@@ -159,16 +159,6 @@ static void sve_free(struct task_struct *task) ...@@ -159,16 +159,6 @@ static void sve_free(struct task_struct *task)
__sve_free(task); __sve_free(task);
} }
static void sve_user_disable(void)
{
sysreg_clear_set(cpacr_el1, CPACR_EL1_ZEN_EL0EN, 0);
}
static void sve_user_enable(void)
{
sysreg_clear_set(cpacr_el1, 0, CPACR_EL1_ZEN_EL0EN);
}
/* /*
* TIF_SVE controls whether a task can use SVE without trapping while * TIF_SVE controls whether a task can use SVE without trapping while
* in userspace, and also the way a task's FPSIMD/SVE state is stored * in userspace, and also the way a task's FPSIMD/SVE state is stored
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment