mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.4 KiB
52 lines
1.4 KiB
/* SPDX-License-Identifier: GPL-2.0-only */ |
|
/* |
|
* Copyright (C) 2017 Linaro Ltd. <[email protected]> |
|
*/ |
|
|
|
#ifndef __ASM_SIMD_H |
|
#define __ASM_SIMD_H |
|
|
|
#include <linux/compiler.h> |
|
#include <linux/irqflags.h> |
|
#include <linux/percpu.h> |
|
#include <linux/preempt.h> |
|
#include <linux/types.h> |
|
|
|
DECLARE_PER_CPU(bool, fpsimd_context_busy); |
|
|
|
#ifdef CONFIG_KERNEL_MODE_NEON |
|
|
|
/* |
|
* may_use_simd - whether it is allowable at this time to issue SIMD |
|
* instructions or access the SIMD register file |
|
* |
|
* Callers must not assume that the result remains true beyond the next |
|
* preempt_enable() or return from softirq context. |
|
*/ |
|
static __must_check inline bool may_use_simd(void) |
|
{ |
|
/* |
|
* We must make sure that the SVE has been initialized properly |
|
* before using the SIMD in kernel. |
|
* fpsimd_context_busy is only set while preemption is disabled, |
|
* and is clear whenever preemption is enabled. Since |
|
* this_cpu_read() is atomic w.r.t. preemption, fpsimd_context_busy |
|
* cannot change under our feet -- if it's set we cannot be |
|
* migrated, and if it's clear we cannot be migrated to a CPU |
|
* where it is set. |
|
*/ |
|
return !WARN_ON(!system_capabilities_finalized()) && |
|
system_supports_fpsimd() && |
|
!in_irq() && !irqs_disabled() && !in_nmi() && |
|
!this_cpu_read(fpsimd_context_busy); |
|
} |
|
|
|
#else /* ! CONFIG_KERNEL_MODE_NEON */ |
|
|
|
static __must_check inline bool may_use_simd(void) { |
|
return false; |
|
} |
|
|
|
#endif /* ! CONFIG_KERNEL_MODE_NEON */ |
|
|
|
#endif
|
|
|