162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * arch/arm64/include/asm/xor.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Authors: Jackie Liu <liuyun01@kylinos.cn>
662306a36Sopenharmony_ci * Copyright (C) 2018,Tianjin KYLIN Information Technology Co., Ltd.
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/hardirq.h>
1062306a36Sopenharmony_ci#include <asm-generic/xor.h>
1162306a36Sopenharmony_ci#include <asm/hwcap.h>
1262306a36Sopenharmony_ci#include <asm/neon.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#ifdef CONFIG_KERNEL_MODE_NEON
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciextern struct xor_block_template const xor_block_inner_neon;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistatic void
1962306a36Sopenharmony_cixor_neon_2(unsigned long bytes, unsigned long * __restrict p1,
2062306a36Sopenharmony_ci	   const unsigned long * __restrict p2)
2162306a36Sopenharmony_ci{
2262306a36Sopenharmony_ci	kernel_neon_begin();
2362306a36Sopenharmony_ci	xor_block_inner_neon.do_2(bytes, p1, p2);
2462306a36Sopenharmony_ci	kernel_neon_end();
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic void
2862306a36Sopenharmony_cixor_neon_3(unsigned long bytes, unsigned long * __restrict p1,
2962306a36Sopenharmony_ci	   const unsigned long * __restrict p2,
3062306a36Sopenharmony_ci	   const unsigned long * __restrict p3)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	kernel_neon_begin();
3362306a36Sopenharmony_ci	xor_block_inner_neon.do_3(bytes, p1, p2, p3);
3462306a36Sopenharmony_ci	kernel_neon_end();
3562306a36Sopenharmony_ci}
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistatic void
3862306a36Sopenharmony_cixor_neon_4(unsigned long bytes, unsigned long * __restrict p1,
3962306a36Sopenharmony_ci	   const unsigned long * __restrict p2,
4062306a36Sopenharmony_ci	   const unsigned long * __restrict p3,
4162306a36Sopenharmony_ci	   const unsigned long * __restrict p4)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	kernel_neon_begin();
4462306a36Sopenharmony_ci	xor_block_inner_neon.do_4(bytes, p1, p2, p3, p4);
4562306a36Sopenharmony_ci	kernel_neon_end();
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistatic void
4962306a36Sopenharmony_cixor_neon_5(unsigned long bytes, unsigned long * __restrict p1,
5062306a36Sopenharmony_ci	   const unsigned long * __restrict p2,
5162306a36Sopenharmony_ci	   const unsigned long * __restrict p3,
5262306a36Sopenharmony_ci	   const unsigned long * __restrict p4,
5362306a36Sopenharmony_ci	   const unsigned long * __restrict p5)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	kernel_neon_begin();
5662306a36Sopenharmony_ci	xor_block_inner_neon.do_5(bytes, p1, p2, p3, p4, p5);
5762306a36Sopenharmony_ci	kernel_neon_end();
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistatic struct xor_block_template xor_block_arm64 = {
6162306a36Sopenharmony_ci	.name   = "arm64_neon",
6262306a36Sopenharmony_ci	.do_2   = xor_neon_2,
6362306a36Sopenharmony_ci	.do_3   = xor_neon_3,
6462306a36Sopenharmony_ci	.do_4   = xor_neon_4,
6562306a36Sopenharmony_ci	.do_5	= xor_neon_5
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ci#undef XOR_TRY_TEMPLATES
6862306a36Sopenharmony_ci#define XOR_TRY_TEMPLATES           \
6962306a36Sopenharmony_ci	do {        \
7062306a36Sopenharmony_ci		xor_speed(&xor_block_8regs);    \
7162306a36Sopenharmony_ci		xor_speed(&xor_block_32regs);    \
7262306a36Sopenharmony_ci		if (cpu_has_neon()) { \
7362306a36Sopenharmony_ci			xor_speed(&xor_block_arm64);\
7462306a36Sopenharmony_ci		} \
7562306a36Sopenharmony_ci	} while (0)
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#endif /* ! CONFIG_KERNEL_MODE_NEON */
78