xref: /illumos-gate/usr/src/common/zfs/zfs_fletcher.h (revision 0886dcad)
1495db6fbSLori Alt /*
2495db6fbSLori Alt  * CDDL HEADER START
3495db6fbSLori Alt  *
4495db6fbSLori Alt  * The contents of this file are subject to the terms of the
5495db6fbSLori Alt  * Common Development and Distribution License (the "License").
6495db6fbSLori Alt  * You may not use this file except in compliance with the License.
7495db6fbSLori Alt  *
8495db6fbSLori Alt  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9495db6fbSLori Alt  * or http://www.opensolaris.org/os/licensing.
10495db6fbSLori Alt  * See the License for the specific language governing permissions
11495db6fbSLori Alt  * and limitations under the License.
12495db6fbSLori Alt  *
13495db6fbSLori Alt  * When distributing Covered Code, include this CDDL HEADER in each
14495db6fbSLori Alt  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15495db6fbSLori Alt  * If applicable, add the following below this CDDL HEADER, with the
16495db6fbSLori Alt  * fields enclosed by brackets "[]" replaced with your own identifying
17495db6fbSLori Alt  * information: Portions Copyright [yyyy] [name of copyright owner]
18495db6fbSLori Alt  *
19495db6fbSLori Alt  * CDDL HEADER END
20495db6fbSLori Alt  */
21495db6fbSLori Alt /*
22495db6fbSLori Alt  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23495db6fbSLori Alt  * Use is subject to license terms.
24495db6fbSLori Alt  */
2545818ee1SMatthew Ahrens /*
2645818ee1SMatthew Ahrens  * Copyright 2013 Saso Kiselkov. All rights reserved.
27770499e1SDan Kimmel  * Copyright (c) 2016 by Delphix. All rights reserved.
2845818ee1SMatthew Ahrens  */
29495db6fbSLori Alt 
30495db6fbSLori Alt #ifndef	_ZFS_FLETCHER_H
31495db6fbSLori Alt #define	_ZFS_FLETCHER_H
32495db6fbSLori Alt 
33495db6fbSLori Alt #include <sys/types.h>
34*0886dcadSAndy Fiddaman #include <sys/spa_checksum.h>
35495db6fbSLori Alt 
36495db6fbSLori Alt #ifdef	__cplusplus
37495db6fbSLori Alt extern "C" {
38495db6fbSLori Alt #endif
39495db6fbSLori Alt 
40495db6fbSLori Alt /*
41495db6fbSLori Alt  * fletcher checksum functions
42*0886dcadSAndy Fiddaman  *
43*0886dcadSAndy Fiddaman  * Note: Fletcher checksum methods expect buffer size to be 4B aligned. This
44*0886dcadSAndy Fiddaman  * limitation stems from the algorithm design. Performing incremental checksum
45*0886dcadSAndy Fiddaman  * without said alignment would yield different results. Therefore, the code
46*0886dcadSAndy Fiddaman  * includes assertions for the size alignment.
47*0886dcadSAndy Fiddaman  * For compatibility, it is required that some code paths calculate checksum of
48*0886dcadSAndy Fiddaman  * non-aligned buffer sizes. For this purpose, `fletcher_4_native_varsize()`
49*0886dcadSAndy Fiddaman  * checksum method is added. This method will ignore last (size % 4) bytes of
50*0886dcadSAndy Fiddaman  * the data buffer.
51495db6fbSLori Alt  */
52495db6fbSLori Alt 
53770499e1SDan Kimmel void fletcher_init(zio_cksum_t *);
54770499e1SDan Kimmel void fletcher_2_native(const void *, size_t, const void *, zio_cksum_t *);
55770499e1SDan Kimmel void fletcher_2_byteswap(const void *, size_t, const void *, zio_cksum_t *);
56770499e1SDan Kimmel int fletcher_2_incremental_native(void *, size_t, void *);
57770499e1SDan Kimmel int fletcher_2_incremental_byteswap(void *, size_t, void *);
58770499e1SDan Kimmel void fletcher_4_native(const void *, size_t, const void *, zio_cksum_t *);
59*0886dcadSAndy Fiddaman void fletcher_4_native_varsize(const void *, size_t, zio_cksum_t *);
60770499e1SDan Kimmel void fletcher_4_byteswap(const void *, size_t, const void *, zio_cksum_t *);
61770499e1SDan Kimmel int fletcher_4_incremental_native(void *, size_t, void *);
62770499e1SDan Kimmel int fletcher_4_incremental_byteswap(void *, size_t, void *);
63*0886dcadSAndy Fiddaman int fletcher_4_impl_set(const char *selector);
64*0886dcadSAndy Fiddaman void fletcher_4_init(void);
65*0886dcadSAndy Fiddaman void fletcher_4_fini(void);
66*0886dcadSAndy Fiddaman 
67*0886dcadSAndy Fiddaman /* Internal fletcher ctx */
68*0886dcadSAndy Fiddaman 
69*0886dcadSAndy Fiddaman typedef struct zfs_fletcher_superscalar {
70*0886dcadSAndy Fiddaman 	uint64_t v[4];
71*0886dcadSAndy Fiddaman } zfs_fletcher_superscalar_t;
72*0886dcadSAndy Fiddaman 
73*0886dcadSAndy Fiddaman typedef struct zfs_fletcher_sse {
74*0886dcadSAndy Fiddaman 	uint64_t v[2];
75*0886dcadSAndy Fiddaman } zfs_fletcher_sse_t;
76*0886dcadSAndy Fiddaman 
77*0886dcadSAndy Fiddaman typedef struct zfs_fletcher_avx {
78*0886dcadSAndy Fiddaman 	uint64_t v[4];
79*0886dcadSAndy Fiddaman } zfs_fletcher_avx_t;
80*0886dcadSAndy Fiddaman 
81*0886dcadSAndy Fiddaman typedef struct zfs_fletcher_avx512 {
82*0886dcadSAndy Fiddaman 	uint64_t v[8];
83*0886dcadSAndy Fiddaman } zfs_fletcher_avx512_t;
84*0886dcadSAndy Fiddaman 
85*0886dcadSAndy Fiddaman typedef union fletcher_4_ctx {
86*0886dcadSAndy Fiddaman 	zio_cksum_t scalar;
87*0886dcadSAndy Fiddaman 	zfs_fletcher_superscalar_t superscalar[4];
88*0886dcadSAndy Fiddaman #ifdef __amd64
89*0886dcadSAndy Fiddaman 	zfs_fletcher_sse_t sse[4];
90*0886dcadSAndy Fiddaman 	zfs_fletcher_avx_t avx[4];
91*0886dcadSAndy Fiddaman 	zfs_fletcher_avx512_t avx512[4];
92*0886dcadSAndy Fiddaman #endif
93*0886dcadSAndy Fiddaman } fletcher_4_ctx_t;
94*0886dcadSAndy Fiddaman 
95*0886dcadSAndy Fiddaman /*
96*0886dcadSAndy Fiddaman  * fletcher checksum struct
97*0886dcadSAndy Fiddaman  */
98*0886dcadSAndy Fiddaman typedef void (*fletcher_4_init_f)(fletcher_4_ctx_t *);
99*0886dcadSAndy Fiddaman typedef void (*fletcher_4_fini_f)(fletcher_4_ctx_t *, zio_cksum_t *);
100*0886dcadSAndy Fiddaman typedef void (*fletcher_4_compute_f)(fletcher_4_ctx_t *,
101*0886dcadSAndy Fiddaman     const void *, size_t);
102*0886dcadSAndy Fiddaman 
103*0886dcadSAndy Fiddaman typedef struct fletcher_4_func {
104*0886dcadSAndy Fiddaman 	fletcher_4_init_f init_native;
105*0886dcadSAndy Fiddaman 	fletcher_4_fini_f fini_native;
106*0886dcadSAndy Fiddaman 	fletcher_4_compute_f compute_native;
107*0886dcadSAndy Fiddaman 	fletcher_4_init_f init_byteswap;
108*0886dcadSAndy Fiddaman 	fletcher_4_fini_f fini_byteswap;
109*0886dcadSAndy Fiddaman 	fletcher_4_compute_f compute_byteswap;
110*0886dcadSAndy Fiddaman 	boolean_t (*valid)(void);
111*0886dcadSAndy Fiddaman 	boolean_t uses_fpu_native;
112*0886dcadSAndy Fiddaman 	boolean_t uses_fpu_byteswap;
113*0886dcadSAndy Fiddaman 	const char *name;
114*0886dcadSAndy Fiddaman } __attribute__((aligned(64))) fletcher_4_ops_t;
115*0886dcadSAndy Fiddaman 
116*0886dcadSAndy Fiddaman extern const fletcher_4_ops_t fletcher_4_superscalar_ops;
117*0886dcadSAndy Fiddaman extern const fletcher_4_ops_t fletcher_4_superscalar4_ops;
118*0886dcadSAndy Fiddaman #ifdef __amd64
119*0886dcadSAndy Fiddaman extern const fletcher_4_ops_t fletcher_4_avx2_ops;
120*0886dcadSAndy Fiddaman extern const fletcher_4_ops_t fletcher_4_sse2_ops;
121*0886dcadSAndy Fiddaman extern const fletcher_4_ops_t fletcher_4_ssse3_ops;
122*0886dcadSAndy Fiddaman extern const fletcher_4_ops_t fletcher_4_avx512f_ops;
123*0886dcadSAndy Fiddaman extern const fletcher_4_ops_t fletcher_4_avx512bw_ops;
124*0886dcadSAndy Fiddaman #endif
125495db6fbSLori Alt 
126495db6fbSLori Alt #ifdef	__cplusplus
127495db6fbSLori Alt }
128495db6fbSLori Alt #endif
129495db6fbSLori Alt 
130495db6fbSLori Alt #endif	/* _ZFS_FLETCHER_H */
131