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