162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0 OR Linux-OpenIB) */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef _RDMA_SIGNATURE_H_ 762306a36Sopenharmony_ci#define _RDMA_SIGNATURE_H_ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/types.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cienum ib_signature_prot_cap { 1262306a36Sopenharmony_ci IB_PROT_T10DIF_TYPE_1 = 1, 1362306a36Sopenharmony_ci IB_PROT_T10DIF_TYPE_2 = 1 << 1, 1462306a36Sopenharmony_ci IB_PROT_T10DIF_TYPE_3 = 1 << 2, 1562306a36Sopenharmony_ci}; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cienum ib_signature_guard_cap { 1862306a36Sopenharmony_ci IB_GUARD_T10DIF_CRC = 1, 1962306a36Sopenharmony_ci IB_GUARD_T10DIF_CSUM = 1 << 1, 2062306a36Sopenharmony_ci}; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/** 2362306a36Sopenharmony_ci * enum ib_signature_type - Signature types 2462306a36Sopenharmony_ci * @IB_SIG_TYPE_NONE: Unprotected. 2562306a36Sopenharmony_ci * @IB_SIG_TYPE_T10_DIF: Type T10-DIF 2662306a36Sopenharmony_ci */ 2762306a36Sopenharmony_cienum ib_signature_type { 2862306a36Sopenharmony_ci IB_SIG_TYPE_NONE, 2962306a36Sopenharmony_ci IB_SIG_TYPE_T10_DIF, 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/** 3362306a36Sopenharmony_ci * enum ib_t10_dif_bg_type - Signature T10-DIF block-guard types 3462306a36Sopenharmony_ci * @IB_T10DIF_CRC: Corresponds to T10-PI mandated CRC checksum rules. 3562306a36Sopenharmony_ci * @IB_T10DIF_CSUM: Corresponds to IP checksum rules. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_cienum ib_t10_dif_bg_type { 3862306a36Sopenharmony_ci IB_T10DIF_CRC, 3962306a36Sopenharmony_ci IB_T10DIF_CSUM, 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci/** 4362306a36Sopenharmony_ci * struct ib_t10_dif_domain - Parameters specific for T10-DIF 4462306a36Sopenharmony_ci * domain. 4562306a36Sopenharmony_ci * @bg_type: T10-DIF block guard type (CRC|CSUM) 4662306a36Sopenharmony_ci * @pi_interval: protection information interval. 4762306a36Sopenharmony_ci * @bg: seed of guard computation. 4862306a36Sopenharmony_ci * @app_tag: application tag of guard block 4962306a36Sopenharmony_ci * @ref_tag: initial guard block reference tag. 5062306a36Sopenharmony_ci * @ref_remap: Indicate wethear the reftag increments each block 5162306a36Sopenharmony_ci * @app_escape: Indicate to skip block check if apptag=0xffff 5262306a36Sopenharmony_ci * @ref_escape: Indicate to skip block check if reftag=0xffffffff 5362306a36Sopenharmony_ci * @apptag_check_mask: check bitmask of application tag. 5462306a36Sopenharmony_ci */ 5562306a36Sopenharmony_cistruct ib_t10_dif_domain { 5662306a36Sopenharmony_ci enum ib_t10_dif_bg_type bg_type; 5762306a36Sopenharmony_ci u16 pi_interval; 5862306a36Sopenharmony_ci u16 bg; 5962306a36Sopenharmony_ci u16 app_tag; 6062306a36Sopenharmony_ci u32 ref_tag; 6162306a36Sopenharmony_ci bool ref_remap; 6262306a36Sopenharmony_ci bool app_escape; 6362306a36Sopenharmony_ci bool ref_escape; 6462306a36Sopenharmony_ci u16 apptag_check_mask; 6562306a36Sopenharmony_ci}; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/** 6862306a36Sopenharmony_ci * struct ib_sig_domain - Parameters for signature domain 6962306a36Sopenharmony_ci * @sig_type: specific signauture type 7062306a36Sopenharmony_ci * @sig: union of all signature domain attributes that may 7162306a36Sopenharmony_ci * be used to set domain layout. 7262306a36Sopenharmony_ci */ 7362306a36Sopenharmony_cistruct ib_sig_domain { 7462306a36Sopenharmony_ci enum ib_signature_type sig_type; 7562306a36Sopenharmony_ci union { 7662306a36Sopenharmony_ci struct ib_t10_dif_domain dif; 7762306a36Sopenharmony_ci } sig; 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci/** 8162306a36Sopenharmony_ci * struct ib_sig_attrs - Parameters for signature handover operation 8262306a36Sopenharmony_ci * @check_mask: bitmask for signature byte check (8 bytes) 8362306a36Sopenharmony_ci * @mem: memory domain layout descriptor. 8462306a36Sopenharmony_ci * @wire: wire domain layout descriptor. 8562306a36Sopenharmony_ci * @meta_length: metadata length 8662306a36Sopenharmony_ci */ 8762306a36Sopenharmony_cistruct ib_sig_attrs { 8862306a36Sopenharmony_ci u8 check_mask; 8962306a36Sopenharmony_ci struct ib_sig_domain mem; 9062306a36Sopenharmony_ci struct ib_sig_domain wire; 9162306a36Sopenharmony_ci int meta_length; 9262306a36Sopenharmony_ci}; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cienum ib_sig_err_type { 9562306a36Sopenharmony_ci IB_SIG_BAD_GUARD, 9662306a36Sopenharmony_ci IB_SIG_BAD_REFTAG, 9762306a36Sopenharmony_ci IB_SIG_BAD_APPTAG, 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci/* 10162306a36Sopenharmony_ci * Signature check masks (8 bytes in total) according to the T10-PI standard: 10262306a36Sopenharmony_ci * -------- -------- ------------ 10362306a36Sopenharmony_ci * | GUARD | APPTAG | REFTAG | 10462306a36Sopenharmony_ci * | 2B | 2B | 4B | 10562306a36Sopenharmony_ci * -------- -------- ------------ 10662306a36Sopenharmony_ci */ 10762306a36Sopenharmony_cienum { 10862306a36Sopenharmony_ci IB_SIG_CHECK_GUARD = 0xc0, 10962306a36Sopenharmony_ci IB_SIG_CHECK_APPTAG = 0x30, 11062306a36Sopenharmony_ci IB_SIG_CHECK_REFTAG = 0x0f, 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci/* 11462306a36Sopenharmony_ci * struct ib_sig_err - signature error descriptor 11562306a36Sopenharmony_ci */ 11662306a36Sopenharmony_cistruct ib_sig_err { 11762306a36Sopenharmony_ci enum ib_sig_err_type err_type; 11862306a36Sopenharmony_ci u32 expected; 11962306a36Sopenharmony_ci u32 actual; 12062306a36Sopenharmony_ci u64 sig_err_offset; 12162306a36Sopenharmony_ci u32 key; 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#endif /* _RDMA_SIGNATURE_H_ */ 125