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