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