xref: /linux/lib/raid/xor/x86/xor_arch.h (revision 440d6635b20037bc9ad46b20817d7b61cef0fc1b)
1*e20043b4SChristoph Hellwig /* SPDX-License-Identifier: GPL-2.0-or-later */
2*e20043b4SChristoph Hellwig #include <asm/cpufeature.h>
3*e20043b4SChristoph Hellwig 
4*e20043b4SChristoph Hellwig extern struct xor_block_template xor_block_pII_mmx;
5*e20043b4SChristoph Hellwig extern struct xor_block_template xor_block_p5_mmx;
6*e20043b4SChristoph Hellwig extern struct xor_block_template xor_block_sse;
7*e20043b4SChristoph Hellwig extern struct xor_block_template xor_block_sse_pf64;
8*e20043b4SChristoph Hellwig extern struct xor_block_template xor_block_avx;
9*e20043b4SChristoph Hellwig 
10*e20043b4SChristoph Hellwig /*
11*e20043b4SChristoph Hellwig  * When SSE is available, use it as it can write around L2.  We may also be able
12*e20043b4SChristoph Hellwig  * to load into the L1 only depending on how the cpu deals with a load to a line
13*e20043b4SChristoph Hellwig  * that is being prefetched.
14*e20043b4SChristoph Hellwig  *
15*e20043b4SChristoph Hellwig  * When AVX2 is available, force using it as it is better by all measures.
16*e20043b4SChristoph Hellwig  *
17*e20043b4SChristoph Hellwig  * 32-bit without MMX can fall back to the generic routines.
18*e20043b4SChristoph Hellwig  */
19*e20043b4SChristoph Hellwig static __always_inline void __init arch_xor_init(void)
20*e20043b4SChristoph Hellwig {
21*e20043b4SChristoph Hellwig 	if (boot_cpu_has(X86_FEATURE_AVX) &&
22*e20043b4SChristoph Hellwig 	    boot_cpu_has(X86_FEATURE_OSXSAVE)) {
23*e20043b4SChristoph Hellwig 		xor_force(&xor_block_avx);
24*e20043b4SChristoph Hellwig 	} else if (IS_ENABLED(CONFIG_X86_64) || boot_cpu_has(X86_FEATURE_XMM)) {
25*e20043b4SChristoph Hellwig 		xor_register(&xor_block_sse);
26*e20043b4SChristoph Hellwig 		xor_register(&xor_block_sse_pf64);
27*e20043b4SChristoph Hellwig 	} else if (boot_cpu_has(X86_FEATURE_MMX)) {
28*e20043b4SChristoph Hellwig 		xor_register(&xor_block_pII_mmx);
29*e20043b4SChristoph Hellwig 		xor_register(&xor_block_p5_mmx);
30*e20043b4SChristoph Hellwig 	} else {
31*e20043b4SChristoph Hellwig 		xor_register(&xor_block_8regs);
32*e20043b4SChristoph Hellwig 		xor_register(&xor_block_8regs_p);
33*e20043b4SChristoph Hellwig 		xor_register(&xor_block_32regs);
34*e20043b4SChristoph Hellwig 		xor_register(&xor_block_32regs_p);
35*e20043b4SChristoph Hellwig 	}
36*e20043b4SChristoph Hellwig }
37