Loading arch/arm64/kernel/fpsimd.c +36 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <linux/cpu_pm.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/sched.h> Loading Loading @@ -83,6 +84,39 @@ void fpsimd_flush_thread(void) fpsimd_load_state(¤t->thread.fpsimd_state); } #ifdef CONFIG_CPU_PM static int fpsimd_cpu_pm_notifier(struct notifier_block *self, unsigned long cmd, void *v) { switch (cmd) { case CPU_PM_ENTER: if (current->mm) fpsimd_save_state(¤t->thread.fpsimd_state); break; case CPU_PM_EXIT: if (current->mm) fpsimd_load_state(¤t->thread.fpsimd_state); break; case CPU_PM_ENTER_FAILED: default: return NOTIFY_DONE; } return NOTIFY_OK; } static struct notifier_block fpsimd_cpu_pm_notifier_block = { .notifier_call = fpsimd_cpu_pm_notifier, }; static void fpsimd_pm_init(void) { cpu_pm_register_notifier(&fpsimd_cpu_pm_notifier_block); } #else static inline void fpsimd_pm_init(void) { } #endif /* CONFIG_CPU_PM */ /* * FP/SIMD support code initialisation. */ Loading @@ -101,6 +135,8 @@ static int __init fpsimd_init(void) else elf_hwcap |= HWCAP_ASIMD; fpsimd_pm_init(); return 0; } late_initcall(fpsimd_init); Loading
arch/arm64/kernel/fpsimd.c +36 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <linux/cpu_pm.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/sched.h> Loading Loading @@ -83,6 +84,39 @@ void fpsimd_flush_thread(void) fpsimd_load_state(¤t->thread.fpsimd_state); } #ifdef CONFIG_CPU_PM static int fpsimd_cpu_pm_notifier(struct notifier_block *self, unsigned long cmd, void *v) { switch (cmd) { case CPU_PM_ENTER: if (current->mm) fpsimd_save_state(¤t->thread.fpsimd_state); break; case CPU_PM_EXIT: if (current->mm) fpsimd_load_state(¤t->thread.fpsimd_state); break; case CPU_PM_ENTER_FAILED: default: return NOTIFY_DONE; } return NOTIFY_OK; } static struct notifier_block fpsimd_cpu_pm_notifier_block = { .notifier_call = fpsimd_cpu_pm_notifier, }; static void fpsimd_pm_init(void) { cpu_pm_register_notifier(&fpsimd_cpu_pm_notifier_block); } #else static inline void fpsimd_pm_init(void) { } #endif /* CONFIG_CPU_PM */ /* * FP/SIMD support code initialisation. */ Loading @@ -101,6 +135,8 @@ static int __init fpsimd_init(void) else elf_hwcap |= HWCAP_ASIMD; fpsimd_pm_init(); return 0; } late_initcall(fpsimd_init);