18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2023 WANG Xuerui <git@xen0n.name> 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci#ifndef _ASM_LOONGARCH_XOR_H 68c2ecf20Sopenharmony_ci#define _ASM_LOONGARCH_XOR_H 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <asm/cpu-features.h> 98c2ecf20Sopenharmony_ci#include <asm/xor_simd.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_HAS_LSX 128c2ecf20Sopenharmony_cistatic struct xor_block_template xor_block_lsx = { 138c2ecf20Sopenharmony_ci .name = "lsx", 148c2ecf20Sopenharmony_ci .do_2 = xor_lsx_2, 158c2ecf20Sopenharmony_ci .do_3 = xor_lsx_3, 168c2ecf20Sopenharmony_ci .do_4 = xor_lsx_4, 178c2ecf20Sopenharmony_ci .do_5 = xor_lsx_5, 188c2ecf20Sopenharmony_ci}; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#define XOR_SPEED_LSX() \ 218c2ecf20Sopenharmony_ci do { \ 228c2ecf20Sopenharmony_ci if (cpu_has_lsx) \ 238c2ecf20Sopenharmony_ci xor_speed(&xor_block_lsx); \ 248c2ecf20Sopenharmony_ci } while (0) 258c2ecf20Sopenharmony_ci#else /* CONFIG_CPU_HAS_LSX */ 268c2ecf20Sopenharmony_ci#define XOR_SPEED_LSX() 278c2ecf20Sopenharmony_ci#endif /* CONFIG_CPU_HAS_LSX */ 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_HAS_LASX 308c2ecf20Sopenharmony_cistatic struct xor_block_template xor_block_lasx = { 318c2ecf20Sopenharmony_ci .name = "lasx", 328c2ecf20Sopenharmony_ci .do_2 = xor_lasx_2, 338c2ecf20Sopenharmony_ci .do_3 = xor_lasx_3, 348c2ecf20Sopenharmony_ci .do_4 = xor_lasx_4, 358c2ecf20Sopenharmony_ci .do_5 = xor_lasx_5, 368c2ecf20Sopenharmony_ci}; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#define XOR_SPEED_LASX() \ 398c2ecf20Sopenharmony_ci do { \ 408c2ecf20Sopenharmony_ci if (cpu_has_lasx) \ 418c2ecf20Sopenharmony_ci xor_speed(&xor_block_lasx); \ 428c2ecf20Sopenharmony_ci } while (0) 438c2ecf20Sopenharmony_ci#else /* CONFIG_CPU_HAS_LASX */ 448c2ecf20Sopenharmony_ci#define XOR_SPEED_LASX() 458c2ecf20Sopenharmony_ci#endif /* CONFIG_CPU_HAS_LASX */ 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci/* 488c2ecf20Sopenharmony_ci * For grins, also test the generic routines. 498c2ecf20Sopenharmony_ci * 508c2ecf20Sopenharmony_ci * More importantly: it cannot be ruled out at this point of time, that some 518c2ecf20Sopenharmony_ci * future (maybe reduced) models could run the vector algorithms slower than 528c2ecf20Sopenharmony_ci * the scalar ones, maybe for errata or micro-op reasons. It may be 538c2ecf20Sopenharmony_ci * appropriate to revisit this after one or two more uarch generations. 548c2ecf20Sopenharmony_ci */ 558c2ecf20Sopenharmony_ci#include <asm-generic/xor.h> 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci#undef XOR_TRY_TEMPLATES 588c2ecf20Sopenharmony_ci#define XOR_TRY_TEMPLATES \ 598c2ecf20Sopenharmony_cido { \ 608c2ecf20Sopenharmony_ci xor_speed(&xor_block_8regs); \ 618c2ecf20Sopenharmony_ci xor_speed(&xor_block_8regs_p); \ 628c2ecf20Sopenharmony_ci xor_speed(&xor_block_32regs); \ 638c2ecf20Sopenharmony_ci xor_speed(&xor_block_32regs_p); \ 648c2ecf20Sopenharmony_ci XOR_SPEED_LSX(); \ 658c2ecf20Sopenharmony_ci XOR_SPEED_LASX(); \ 668c2ecf20Sopenharmony_ci} while (0) 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci#endif /* _ASM_LOONGARCH_XOR_H */ 69