Auto-detect whether to use hw assisted crc32c
[fio.git] / crc / crc32c-intel.c
index 5040efeae9030005af296bfa72c07414535144a4..8a6e6dcefb749b41ed5ecddb7035ae6a8c247adf 100644 (file)
@@ -18,6 +18,8 @@
  * Volume 2A: Instruction Set Reference, A-M
  */
 
+int crc32c_intel_available = 0;
+
 #ifdef ARCH_HAVE_SSE4_2
 
 #if BITS_PER_LONG == 64
@@ -28,6 +30,8 @@
 #define SCALE_F 4
 #endif
 
+static int crc32c_probed;
+
 static uint32_t crc32c_intel_le_hw_byte(uint32_t crc, unsigned char const *data,
                                        unsigned long length)
 {
@@ -90,14 +94,17 @@ static void do_cpuid(unsigned int *eax, unsigned int *ebx, unsigned int *ecx,
                : "eax", "ebx", "ecx", "edx");
 }
 
-int crc32c_intel_works(void)
+void crc32c_intel_probe(void)
 {
-       unsigned int eax, ebx, ecx, edx;
+       if (!crc32c_probed) {
+               unsigned int eax, ebx, ecx, edx;
 
-       eax = 1;
+               eax = 1;
 
-       do_cpuid(&eax, &ebx, &ecx, &edx);
-       return (ecx & (1 << 20)) != 0;
+               do_cpuid(&eax, &ebx, &ecx, &edx);
+               crc32c_intel_available = (ecx & (1 << 20)) != 0;
+               crc32c_probed = 1;
+       }
 }
 
 #endif /* ARCH_HAVE_SSE */