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