4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or https://opensource.org/licenses/CDDL-1.0.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 * Copyright 2013 Saso Kiselkov. All rights reserved.
29 #ifndef _ZFS_FLETCHER_H
30 #define _ZFS_FLETCHER_H extern __attribute__((visibility("default")))
32 #include <sys/types.h>
33 #include <sys/spa_checksum.h>
40 * fletcher checksum functions
42 * Note: Fletcher checksum methods expect buffer size to be 4B aligned. This
43 * limitation stems from the algorithm design. Performing incremental checksum
44 * without said alignment would yield different results. Therefore, the code
45 * includes assertions for the size alignment.
46 * For compatibility, it is required that some code paths calculate checksum of
47 * non-aligned buffer sizes. For this purpose, `fletcher_4_native_varsize()`
48 * checksum method is added. This method will ignore last (size % 4) bytes of
51 _ZFS_FLETCHER_H
void fletcher_init(zio_cksum_t
*);
52 _ZFS_FLETCHER_H
void fletcher_2_native(const void *, uint64_t, const void *,
54 _ZFS_FLETCHER_H
void fletcher_2_byteswap(const void *, uint64_t, const void *,
56 _ZFS_FLETCHER_H
void fletcher_4_native(const void *, uint64_t, const void *,
58 _ZFS_FLETCHER_H
int fletcher_2_incremental_native(void *, size_t, void *);
59 _ZFS_FLETCHER_H
int fletcher_2_incremental_byteswap(void *, size_t, void *);
60 _ZFS_FLETCHER_H
void fletcher_4_native_varsize(const void *, uint64_t,
62 _ZFS_FLETCHER_H
void fletcher_4_byteswap(const void *, uint64_t, const void *,
64 _ZFS_FLETCHER_H
int fletcher_4_incremental_native(void *, size_t, void *);
65 _ZFS_FLETCHER_H
int fletcher_4_incremental_byteswap(void *, size_t, void *);
66 _ZFS_FLETCHER_H
int fletcher_4_impl_set(const char *selector
);
67 _ZFS_FLETCHER_H
void fletcher_4_init(void);
68 _ZFS_FLETCHER_H
void fletcher_4_fini(void);
72 /* Internal fletcher ctx */
74 typedef struct zfs_fletcher_superscalar
{
76 } zfs_fletcher_superscalar_t
;
78 typedef struct zfs_fletcher_sse
{
82 typedef struct zfs_fletcher_avx
{
86 typedef struct zfs_fletcher_avx512
{
88 } zfs_fletcher_avx512_t
;
90 typedef struct zfs_fletcher_aarch64_neon
{
92 } zfs_fletcher_aarch64_neon_t
;
95 typedef union fletcher_4_ctx
{
97 zfs_fletcher_superscalar_t superscalar
[4];
99 #if defined(HAVE_SSE2) || (defined(HAVE_SSE2) && defined(HAVE_SSSE3))
100 zfs_fletcher_sse_t sse
[4];
102 #if defined(HAVE_AVX) && defined(HAVE_AVX2)
103 zfs_fletcher_avx_t avx
[4];
105 #if defined(__x86_64) && defined(HAVE_AVX512F)
106 zfs_fletcher_avx512_t avx512
[4];
108 #if defined(__aarch64__)
109 zfs_fletcher_aarch64_neon_t aarch64_neon
[4];
114 * fletcher checksum struct
116 typedef void (*fletcher_4_init_f
)(fletcher_4_ctx_t
*);
117 typedef void (*fletcher_4_fini_f
)(fletcher_4_ctx_t
*, zio_cksum_t
*);
118 typedef void (*fletcher_4_compute_f
)(fletcher_4_ctx_t
*,
119 const void *, uint64_t);
121 typedef struct fletcher_4_func
{
122 fletcher_4_init_f init_native
;
123 fletcher_4_fini_f fini_native
;
124 fletcher_4_compute_f compute_native
;
125 fletcher_4_init_f init_byteswap
;
126 fletcher_4_fini_f fini_byteswap
;
127 fletcher_4_compute_f compute_byteswap
;
128 boolean_t (*valid
)(void);
131 } __attribute__((aligned(64))) fletcher_4_ops_t
;
133 _ZFS_FLETCHER_H
const fletcher_4_ops_t fletcher_4_superscalar_ops
;
134 _ZFS_FLETCHER_H
const fletcher_4_ops_t fletcher_4_superscalar4_ops
;
136 #if defined(HAVE_SSE2)
137 _ZFS_FLETCHER_H
const fletcher_4_ops_t fletcher_4_sse2_ops
;
140 #if defined(HAVE_SSE2) && defined(HAVE_SSSE3)
141 _ZFS_FLETCHER_H
const fletcher_4_ops_t fletcher_4_ssse3_ops
;
144 #if defined(HAVE_AVX) && defined(HAVE_AVX2)
145 _ZFS_FLETCHER_H
const fletcher_4_ops_t fletcher_4_avx2_ops
;
148 #if defined(__x86_64) && defined(HAVE_AVX512F)
149 _ZFS_FLETCHER_H
const fletcher_4_ops_t fletcher_4_avx512f_ops
;
152 #if defined(__x86_64) && defined(HAVE_AVX512BW)
153 _ZFS_FLETCHER_H
const fletcher_4_ops_t fletcher_4_avx512bw_ops
;
156 #if defined(__aarch64__)
157 _ZFS_FLETCHER_H
const fletcher_4_ops_t fletcher_4_aarch64_neon_ops
;
164 #endif /* _ZFS_FLETCHER_H */