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