18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * arch/arm64/include/asm/xor.h
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Authors: Jackie Liu <liuyun01@kylinos.cn>
68c2ecf20Sopenharmony_ci * Copyright (C) 2018,Tianjin KYLIN Information Technology Co., Ltd.
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/hardirq.h>
108c2ecf20Sopenharmony_ci#include <asm-generic/xor.h>
118c2ecf20Sopenharmony_ci#include <asm/hwcap.h>
128c2ecf20Sopenharmony_ci#include <asm/neon.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#ifdef CONFIG_KERNEL_MODE_NEON
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ciextern struct xor_block_template const xor_block_inner_neon;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cistatic void
198c2ecf20Sopenharmony_cixor_neon_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
208c2ecf20Sopenharmony_ci{
218c2ecf20Sopenharmony_ci	kernel_neon_begin();
228c2ecf20Sopenharmony_ci	xor_block_inner_neon.do_2(bytes, p1, p2);
238c2ecf20Sopenharmony_ci	kernel_neon_end();
248c2ecf20Sopenharmony_ci}
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistatic void
278c2ecf20Sopenharmony_cixor_neon_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
288c2ecf20Sopenharmony_ci		unsigned long *p3)
298c2ecf20Sopenharmony_ci{
308c2ecf20Sopenharmony_ci	kernel_neon_begin();
318c2ecf20Sopenharmony_ci	xor_block_inner_neon.do_3(bytes, p1, p2, p3);
328c2ecf20Sopenharmony_ci	kernel_neon_end();
338c2ecf20Sopenharmony_ci}
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_cistatic void
368c2ecf20Sopenharmony_cixor_neon_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
378c2ecf20Sopenharmony_ci		unsigned long *p3, unsigned long *p4)
388c2ecf20Sopenharmony_ci{
398c2ecf20Sopenharmony_ci	kernel_neon_begin();
408c2ecf20Sopenharmony_ci	xor_block_inner_neon.do_4(bytes, p1, p2, p3, p4);
418c2ecf20Sopenharmony_ci	kernel_neon_end();
428c2ecf20Sopenharmony_ci}
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cistatic void
458c2ecf20Sopenharmony_cixor_neon_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
468c2ecf20Sopenharmony_ci		unsigned long *p3, unsigned long *p4, unsigned long *p5)
478c2ecf20Sopenharmony_ci{
488c2ecf20Sopenharmony_ci	kernel_neon_begin();
498c2ecf20Sopenharmony_ci	xor_block_inner_neon.do_5(bytes, p1, p2, p3, p4, p5);
508c2ecf20Sopenharmony_ci	kernel_neon_end();
518c2ecf20Sopenharmony_ci}
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_cistatic struct xor_block_template xor_block_arm64 = {
548c2ecf20Sopenharmony_ci	.name   = "arm64_neon",
558c2ecf20Sopenharmony_ci	.do_2   = xor_neon_2,
568c2ecf20Sopenharmony_ci	.do_3   = xor_neon_3,
578c2ecf20Sopenharmony_ci	.do_4   = xor_neon_4,
588c2ecf20Sopenharmony_ci	.do_5	= xor_neon_5
598c2ecf20Sopenharmony_ci};
608c2ecf20Sopenharmony_ci#undef XOR_TRY_TEMPLATES
618c2ecf20Sopenharmony_ci#define XOR_TRY_TEMPLATES           \
628c2ecf20Sopenharmony_ci	do {        \
638c2ecf20Sopenharmony_ci		xor_speed(&xor_block_8regs);    \
648c2ecf20Sopenharmony_ci		xor_speed(&xor_block_32regs);    \
658c2ecf20Sopenharmony_ci		if (cpu_has_neon()) { \
668c2ecf20Sopenharmony_ci			xor_speed(&xor_block_arm64);\
678c2ecf20Sopenharmony_ci		} \
688c2ecf20Sopenharmony_ci	} while (0)
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci#endif /* ! CONFIG_KERNEL_MODE_NEON */
71