1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _RDMA_SIGNATURE_H_ 7*4882a593Smuzhiyun #define _RDMA_SIGNATURE_H_ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/types.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun enum ib_signature_prot_cap { 12*4882a593Smuzhiyun IB_PROT_T10DIF_TYPE_1 = 1, 13*4882a593Smuzhiyun IB_PROT_T10DIF_TYPE_2 = 1 << 1, 14*4882a593Smuzhiyun IB_PROT_T10DIF_TYPE_3 = 1 << 2, 15*4882a593Smuzhiyun }; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun enum ib_signature_guard_cap { 18*4882a593Smuzhiyun IB_GUARD_T10DIF_CRC = 1, 19*4882a593Smuzhiyun IB_GUARD_T10DIF_CSUM = 1 << 1, 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /** 23*4882a593Smuzhiyun * enum ib_signature_type - Signature types 24*4882a593Smuzhiyun * @IB_SIG_TYPE_NONE: Unprotected. 25*4882a593Smuzhiyun * @IB_SIG_TYPE_T10_DIF: Type T10-DIF 26*4882a593Smuzhiyun */ 27*4882a593Smuzhiyun enum ib_signature_type { 28*4882a593Smuzhiyun IB_SIG_TYPE_NONE, 29*4882a593Smuzhiyun IB_SIG_TYPE_T10_DIF, 30*4882a593Smuzhiyun }; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /** 33*4882a593Smuzhiyun * enum ib_t10_dif_bg_type - Signature T10-DIF block-guard types 34*4882a593Smuzhiyun * @IB_T10DIF_CRC: Corresponds to T10-PI mandated CRC checksum rules. 35*4882a593Smuzhiyun * @IB_T10DIF_CSUM: Corresponds to IP checksum rules. 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun enum ib_t10_dif_bg_type { 38*4882a593Smuzhiyun IB_T10DIF_CRC, 39*4882a593Smuzhiyun IB_T10DIF_CSUM, 40*4882a593Smuzhiyun }; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /** 43*4882a593Smuzhiyun * struct ib_t10_dif_domain - Parameters specific for T10-DIF 44*4882a593Smuzhiyun * domain. 45*4882a593Smuzhiyun * @bg_type: T10-DIF block guard type (CRC|CSUM) 46*4882a593Smuzhiyun * @pi_interval: protection information interval. 47*4882a593Smuzhiyun * @bg: seed of guard computation. 48*4882a593Smuzhiyun * @app_tag: application tag of guard block 49*4882a593Smuzhiyun * @ref_tag: initial guard block reference tag. 50*4882a593Smuzhiyun * @ref_remap: Indicate wethear the reftag increments each block 51*4882a593Smuzhiyun * @app_escape: Indicate to skip block check if apptag=0xffff 52*4882a593Smuzhiyun * @ref_escape: Indicate to skip block check if reftag=0xffffffff 53*4882a593Smuzhiyun * @apptag_check_mask: check bitmask of application tag. 54*4882a593Smuzhiyun */ 55*4882a593Smuzhiyun struct ib_t10_dif_domain { 56*4882a593Smuzhiyun enum ib_t10_dif_bg_type bg_type; 57*4882a593Smuzhiyun u16 pi_interval; 58*4882a593Smuzhiyun u16 bg; 59*4882a593Smuzhiyun u16 app_tag; 60*4882a593Smuzhiyun u32 ref_tag; 61*4882a593Smuzhiyun bool ref_remap; 62*4882a593Smuzhiyun bool app_escape; 63*4882a593Smuzhiyun bool ref_escape; 64*4882a593Smuzhiyun u16 apptag_check_mask; 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /** 68*4882a593Smuzhiyun * struct ib_sig_domain - Parameters for signature domain 69*4882a593Smuzhiyun * @sig_type: specific signauture type 70*4882a593Smuzhiyun * @sig: union of all signature domain attributes that may 71*4882a593Smuzhiyun * be used to set domain layout. 72*4882a593Smuzhiyun */ 73*4882a593Smuzhiyun struct ib_sig_domain { 74*4882a593Smuzhiyun enum ib_signature_type sig_type; 75*4882a593Smuzhiyun union { 76*4882a593Smuzhiyun struct ib_t10_dif_domain dif; 77*4882a593Smuzhiyun } sig; 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /** 81*4882a593Smuzhiyun * struct ib_sig_attrs - Parameters for signature handover operation 82*4882a593Smuzhiyun * @check_mask: bitmask for signature byte check (8 bytes) 83*4882a593Smuzhiyun * @mem: memory domain layout descriptor. 84*4882a593Smuzhiyun * @wire: wire domain layout descriptor. 85*4882a593Smuzhiyun * @meta_length: metadata length 86*4882a593Smuzhiyun */ 87*4882a593Smuzhiyun struct ib_sig_attrs { 88*4882a593Smuzhiyun u8 check_mask; 89*4882a593Smuzhiyun struct ib_sig_domain mem; 90*4882a593Smuzhiyun struct ib_sig_domain wire; 91*4882a593Smuzhiyun int meta_length; 92*4882a593Smuzhiyun }; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun enum ib_sig_err_type { 95*4882a593Smuzhiyun IB_SIG_BAD_GUARD, 96*4882a593Smuzhiyun IB_SIG_BAD_REFTAG, 97*4882a593Smuzhiyun IB_SIG_BAD_APPTAG, 98*4882a593Smuzhiyun }; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* 101*4882a593Smuzhiyun * Signature check masks (8 bytes in total) according to the T10-PI standard: 102*4882a593Smuzhiyun * -------- -------- ------------ 103*4882a593Smuzhiyun * | GUARD | APPTAG | REFTAG | 104*4882a593Smuzhiyun * | 2B | 2B | 4B | 105*4882a593Smuzhiyun * -------- -------- ------------ 106*4882a593Smuzhiyun */ 107*4882a593Smuzhiyun enum { 108*4882a593Smuzhiyun IB_SIG_CHECK_GUARD = 0xc0, 109*4882a593Smuzhiyun IB_SIG_CHECK_APPTAG = 0x30, 110*4882a593Smuzhiyun IB_SIG_CHECK_REFTAG = 0x0f, 111*4882a593Smuzhiyun }; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* 114*4882a593Smuzhiyun * struct ib_sig_err - signature error descriptor 115*4882a593Smuzhiyun */ 116*4882a593Smuzhiyun struct ib_sig_err { 117*4882a593Smuzhiyun enum ib_sig_err_type err_type; 118*4882a593Smuzhiyun u32 expected; 119*4882a593Smuzhiyun u32 actual; 120*4882a593Smuzhiyun u64 sig_err_offset; 121*4882a593Smuzhiyun u32 key; 122*4882a593Smuzhiyun }; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #endif /* _RDMA_SIGNATURE_H_ */ 125