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

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

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
Loading
Loading
Loading
Loading
+16 −1
Original line number Original line Diff line number Diff line
@@ -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,
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)
	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; }
+0 −10
Original line number Original line Diff line number Diff line
@@ -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