2025-05-14 05:24:09 +00:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
2005-04-16 22:20:36 +00:00
|
|
|
#ifndef _LINUX_CRC32_H
|
|
|
|
#define _LINUX_CRC32_H
|
|
|
|
|
|
|
|
#include <linux/types.h>
|
2006-12-08 10:36:25 +00:00
|
|
|
#include <linux/bitrev.h>
|
2005-04-16 22:20:36 +00:00
|
|
|
|
2025-02-08 02:49:08 +00:00
|
|
|
u32 crc32_le_arch(u32 crc, const u8 *p, size_t len);
|
|
|
|
u32 crc32_le_base(u32 crc, const u8 *p, size_t len);
|
|
|
|
u32 crc32_be_arch(u32 crc, const u8 *p, size_t len);
|
|
|
|
u32 crc32_be_base(u32 crc, const u8 *p, size_t len);
|
2025-02-08 02:49:11 +00:00
|
|
|
u32 crc32c_arch(u32 crc, const u8 *p, size_t len);
|
|
|
|
u32 crc32c_base(u32 crc, const u8 *p, size_t len);
|
2024-12-02 01:08:27 +00:00
|
|
|
|
2025-02-08 02:49:08 +00:00
|
|
|
static inline u32 crc32_le(u32 crc, const void *p, size_t len)
|
2024-12-02 01:08:27 +00:00
|
|
|
{
|
|
|
|
if (IS_ENABLED(CONFIG_CRC32_ARCH))
|
|
|
|
return crc32_le_arch(crc, p, len);
|
|
|
|
return crc32_le_base(crc, p, len);
|
|
|
|
}
|
|
|
|
|
2025-02-08 02:49:08 +00:00
|
|
|
static inline u32 crc32_be(u32 crc, const void *p, size_t len)
|
2024-12-02 01:08:27 +00:00
|
|
|
{
|
|
|
|
if (IS_ENABLED(CONFIG_CRC32_ARCH))
|
|
|
|
return crc32_be_arch(crc, p, len);
|
|
|
|
return crc32_be_base(crc, p, len);
|
|
|
|
}
|
|
|
|
|
lib/crc32: standardize on crc32c() name for Castagnoli CRC32
For historical reasons, the Castagnoli CRC32 is available under 3 names:
crc32c(), crc32c_le(), and __crc32c_le(). Most callers use crc32c().
The more verbose versions are not really warranted; there is no "_be"
version that the "_le" version needs to be differentiated from, and the
leading underscores are pointless.
Therefore, let's standardize on just crc32c(). Remove the other two
names, and update callers accordingly.
Specifically, the new crc32c() comes from what was previously
__crc32c_le(), so compared to the old crc32c() it now takes a size_t
length rather than unsigned int, and it's now in linux/crc32.h instead
of just linux/crc32c.h (which includes linux/crc32.h).
Later patches will also rename __crc32c_le_combine(), crc32c_le_base(),
and crc32c_le_arch().
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20250208024911.14936-5-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@google.com>
2025-02-08 02:49:09 +00:00
|
|
|
static inline u32 crc32c(u32 crc, const void *p, size_t len)
|
2024-12-02 01:08:27 +00:00
|
|
|
{
|
|
|
|
if (IS_ENABLED(CONFIG_CRC32_ARCH))
|
2025-02-08 02:49:11 +00:00
|
|
|
return crc32c_arch(crc, p, len);
|
|
|
|
return crc32c_base(crc, p, len);
|
2024-12-02 01:08:27 +00:00
|
|
|
}
|
2005-04-16 22:20:36 +00:00
|
|
|
|
2024-12-02 01:08:28 +00:00
|
|
|
/*
|
|
|
|
* crc32_optimizations() returns flags that indicate which CRC32 library
|
|
|
|
* functions are using architecture-specific optimizations. Unlike
|
|
|
|
* IS_ENABLED(CONFIG_CRC32_ARCH) it takes into account the different CRC32
|
|
|
|
* variants and also whether any needed CPU features are available at runtime.
|
|
|
|
*/
|
|
|
|
#define CRC32_LE_OPTIMIZATION BIT(0) /* crc32_le() is optimized */
|
|
|
|
#define CRC32_BE_OPTIMIZATION BIT(1) /* crc32_be() is optimized */
|
lib/crc32: standardize on crc32c() name for Castagnoli CRC32
For historical reasons, the Castagnoli CRC32 is available under 3 names:
crc32c(), crc32c_le(), and __crc32c_le(). Most callers use crc32c().
The more verbose versions are not really warranted; there is no "_be"
version that the "_le" version needs to be differentiated from, and the
leading underscores are pointless.
Therefore, let's standardize on just crc32c(). Remove the other two
names, and update callers accordingly.
Specifically, the new crc32c() comes from what was previously
__crc32c_le(), so compared to the old crc32c() it now takes a size_t
length rather than unsigned int, and it's now in linux/crc32.h instead
of just linux/crc32c.h (which includes linux/crc32.h).
Later patches will also rename __crc32c_le_combine(), crc32c_le_base(),
and crc32c_le_arch().
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20250208024911.14936-5-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@google.com>
2025-02-08 02:49:09 +00:00
|
|
|
#define CRC32C_OPTIMIZATION BIT(2) /* crc32c() is optimized */
|
2024-12-02 01:08:28 +00:00
|
|
|
#if IS_ENABLED(CONFIG_CRC32_ARCH)
|
|
|
|
u32 crc32_optimizations(void);
|
|
|
|
#else
|
|
|
|
static inline u32 crc32_optimizations(void) { return 0; }
|
|
|
|
#endif
|
|
|
|
|
2013-10-30 10:50:49 +00:00
|
|
|
/**
|
|
|
|
* crc32_le_combine - Combine two crc32 check values into one. For two
|
|
|
|
* sequences of bytes, seq1 and seq2 with lengths len1
|
|
|
|
* and len2, crc32_le() check values were calculated
|
|
|
|
* for each, crc1 and crc2.
|
|
|
|
*
|
|
|
|
* @crc1: crc32 of the first block
|
|
|
|
* @crc2: crc32 of the second block
|
|
|
|
* @len2: length of the second block
|
|
|
|
*
|
|
|
|
* Return: The crc32_le() check value of seq1 and seq2 concatenated,
|
|
|
|
* requiring only crc1, crc2, and len2. Note: If seq_full denotes
|
|
|
|
* the concatenated memory area of seq1 with seq2, and crc_full
|
|
|
|
* the crc32_le() value of seq_full, then crc_full ==
|
|
|
|
* crc32_le_combine(crc1, crc2, len2) when crc_full was seeded
|
|
|
|
* with the same initializer as crc1, and crc2 seed was 0. See
|
|
|
|
* also crc32_combine_test().
|
|
|
|
*/
|
2025-02-08 02:49:08 +00:00
|
|
|
u32 crc32_le_shift(u32 crc, size_t len);
|
2014-06-23 13:11:54 +00:00
|
|
|
|
|
|
|
static inline u32 crc32_le_combine(u32 crc1, u32 crc2, size_t len2)
|
|
|
|
{
|
|
|
|
return crc32_le_shift(crc1, len2) ^ crc2;
|
|
|
|
}
|
2013-10-30 10:50:49 +00:00
|
|
|
|
2011-03-22 23:34:45 +00:00
|
|
|
#define crc32(seed, data, length) crc32_le(seed, (unsigned char const *)(data), length)
|
2005-04-16 22:20:36 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Helpers for hash table generation of ethernet nics:
|
|
|
|
*
|
|
|
|
* Ethernet sends the least significant bit of a byte first, thus crc32_le
|
|
|
|
* is used. The output of crc32_le is bit reversed [most significant bit
|
|
|
|
* is in bit nr 0], thus it must be reversed before use. Except for
|
|
|
|
* nics that bit swap the result internally...
|
|
|
|
*/
|
2006-12-08 10:36:25 +00:00
|
|
|
#define ether_crc(length, data) bitrev32(crc32_le(~0, data, length))
|
2005-04-16 22:20:36 +00:00
|
|
|
#define ether_crc_le(length, data) crc32_le(~0, data, length)
|
|
|
|
|
|
|
|
#endif /* _LINUX_CRC32_H */
|