xref: /openbmc/linux/include/linux/nvme-tcp.h (revision aa01c67d)
1055d045aSChristoph Hellwig /* SPDX-License-Identifier: GPL-2.0 */
2fc221d05SSagi Grimberg /*
3fc221d05SSagi Grimberg  * NVMe over Fabrics TCP protocol header.
4fc221d05SSagi Grimberg  * Copyright (c) 2018 Lightbits Labs. All rights reserved.
5fc221d05SSagi Grimberg  */
6fc221d05SSagi Grimberg 
7fc221d05SSagi Grimberg #ifndef _LINUX_NVME_TCP_H
8fc221d05SSagi Grimberg #define _LINUX_NVME_TCP_H
9fc221d05SSagi Grimberg 
10fc221d05SSagi Grimberg #include <linux/nvme.h>
11fc221d05SSagi Grimberg 
12fc221d05SSagi Grimberg #define NVME_TCP_DISC_PORT	8009
13fc221d05SSagi Grimberg #define NVME_TCP_ADMIN_CCSZ	SZ_8K
14fc221d05SSagi Grimberg #define NVME_TCP_DIGEST_LENGTH	4
15c2700d28SVarun Prakash #define NVME_TCP_MIN_MAXH2CDATA 4096
16fc221d05SSagi Grimberg 
17fc221d05SSagi Grimberg enum nvme_tcp_pfv {
18fc221d05SSagi Grimberg 	NVME_TCP_PFV_1_0 = 0x0,
19fc221d05SSagi Grimberg };
20fc221d05SSagi Grimberg 
21fc221d05SSagi Grimberg enum nvme_tcp_fatal_error_status {
22fc221d05SSagi Grimberg 	NVME_TCP_FES_INVALID_PDU_HDR		= 0x01,
23fc221d05SSagi Grimberg 	NVME_TCP_FES_PDU_SEQ_ERR		= 0x02,
24fc221d05SSagi Grimberg 	NVME_TCP_FES_HDR_DIGEST_ERR		= 0x03,
25fc221d05SSagi Grimberg 	NVME_TCP_FES_DATA_OUT_OF_RANGE		= 0x04,
26fc221d05SSagi Grimberg 	NVME_TCP_FES_R2T_LIMIT_EXCEEDED		= 0x05,
27fc221d05SSagi Grimberg 	NVME_TCP_FES_DATA_LIMIT_EXCEEDED	= 0x05,
28fc221d05SSagi Grimberg 	NVME_TCP_FES_UNSUPPORTED_PARAM		= 0x06,
29fc221d05SSagi Grimberg };
30fc221d05SSagi Grimberg 
31fc221d05SSagi Grimberg enum nvme_tcp_digest_option {
32fc221d05SSagi Grimberg 	NVME_TCP_HDR_DIGEST_ENABLE	= (1 << 0),
33fc221d05SSagi Grimberg 	NVME_TCP_DATA_DIGEST_ENABLE	= (1 << 1),
34fc221d05SSagi Grimberg };
35fc221d05SSagi Grimberg 
36fc221d05SSagi Grimberg enum nvme_tcp_pdu_type {
37fc221d05SSagi Grimberg 	nvme_tcp_icreq		= 0x0,
38fc221d05SSagi Grimberg 	nvme_tcp_icresp		= 0x1,
39fc221d05SSagi Grimberg 	nvme_tcp_h2c_term	= 0x2,
40fc221d05SSagi Grimberg 	nvme_tcp_c2h_term	= 0x3,
41fc221d05SSagi Grimberg 	nvme_tcp_cmd		= 0x4,
42fc221d05SSagi Grimberg 	nvme_tcp_rsp		= 0x5,
43fc221d05SSagi Grimberg 	nvme_tcp_h2c_data	= 0x6,
44fc221d05SSagi Grimberg 	nvme_tcp_c2h_data	= 0x7,
45fc221d05SSagi Grimberg 	nvme_tcp_r2t		= 0x9,
46fc221d05SSagi Grimberg };
47fc221d05SSagi Grimberg 
48fc221d05SSagi Grimberg enum nvme_tcp_pdu_flags {
49fc221d05SSagi Grimberg 	NVME_TCP_F_HDGST		= (1 << 0),
50fc221d05SSagi Grimberg 	NVME_TCP_F_DDGST		= (1 << 1),
51fc221d05SSagi Grimberg 	NVME_TCP_F_DATA_LAST		= (1 << 2),
52fc221d05SSagi Grimberg 	NVME_TCP_F_DATA_SUCCESS		= (1 << 3),
53fc221d05SSagi Grimberg };
54fc221d05SSagi Grimberg 
55fc221d05SSagi Grimberg /**
56fc221d05SSagi Grimberg  * struct nvme_tcp_hdr - nvme tcp pdu common header
57fc221d05SSagi Grimberg  *
58fc221d05SSagi Grimberg  * @type:          pdu type
59fc221d05SSagi Grimberg  * @flags:         pdu specific flags
60fc221d05SSagi Grimberg  * @hlen:          pdu header length
61fc221d05SSagi Grimberg  * @pdo:           pdu data offset
62fc221d05SSagi Grimberg  * @plen:          pdu wire byte length
63fc221d05SSagi Grimberg  */
64fc221d05SSagi Grimberg struct nvme_tcp_hdr {
65fc221d05SSagi Grimberg 	__u8	type;
66fc221d05SSagi Grimberg 	__u8	flags;
67fc221d05SSagi Grimberg 	__u8	hlen;
68fc221d05SSagi Grimberg 	__u8	pdo;
69fc221d05SSagi Grimberg 	__le32	plen;
70fc221d05SSagi Grimberg };
71fc221d05SSagi Grimberg 
72fc221d05SSagi Grimberg /**
73fc221d05SSagi Grimberg  * struct nvme_tcp_icreq_pdu - nvme tcp initialize connection request pdu
74fc221d05SSagi Grimberg  *
75fc221d05SSagi Grimberg  * @hdr:           pdu generic header
76fc221d05SSagi Grimberg  * @pfv:           pdu version format
77fc221d05SSagi Grimberg  * @hpda:          host pdu data alignment (dwords, 0's based)
78fc221d05SSagi Grimberg  * @digest:        digest types enabled
79fc221d05SSagi Grimberg  * @maxr2t:        maximum r2ts per request supported
80fc221d05SSagi Grimberg  */
81fc221d05SSagi Grimberg struct nvme_tcp_icreq_pdu {
82fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
83fc221d05SSagi Grimberg 	__le16			pfv;
84fc221d05SSagi Grimberg 	__u8			hpda;
85fc221d05SSagi Grimberg 	__u8			digest;
86fc221d05SSagi Grimberg 	__le32			maxr2t;
87fc221d05SSagi Grimberg 	__u8			rsvd2[112];
88fc221d05SSagi Grimberg };
89fc221d05SSagi Grimberg 
90fc221d05SSagi Grimberg /**
91fc221d05SSagi Grimberg  * struct nvme_tcp_icresp_pdu - nvme tcp initialize connection response pdu
92fc221d05SSagi Grimberg  *
93fc221d05SSagi Grimberg  * @hdr:           pdu common header
94fc221d05SSagi Grimberg  * @pfv:           pdu version format
95fc221d05SSagi Grimberg  * @cpda:          controller pdu data alignment (dowrds, 0's based)
96fc221d05SSagi Grimberg  * @digest:        digest types enabled
97fc221d05SSagi Grimberg  * @maxdata:       maximum data capsules per r2t supported
98fc221d05SSagi Grimberg  */
99fc221d05SSagi Grimberg struct nvme_tcp_icresp_pdu {
100fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
101fc221d05SSagi Grimberg 	__le16			pfv;
102fc221d05SSagi Grimberg 	__u8			cpda;
103fc221d05SSagi Grimberg 	__u8			digest;
104fc221d05SSagi Grimberg 	__le32			maxdata;
105fc221d05SSagi Grimberg 	__u8			rsvd[112];
106fc221d05SSagi Grimberg };
107fc221d05SSagi Grimberg 
108fc221d05SSagi Grimberg /**
109fc221d05SSagi Grimberg  * struct nvme_tcp_term_pdu - nvme tcp terminate connection pdu
110fc221d05SSagi Grimberg  *
111fc221d05SSagi Grimberg  * @hdr:           pdu common header
112fc221d05SSagi Grimberg  * @fes:           fatal error status
113fc221d05SSagi Grimberg  * @fei:           fatal error information
114fc221d05SSagi Grimberg  */
115fc221d05SSagi Grimberg struct nvme_tcp_term_pdu {
116fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
117fc221d05SSagi Grimberg 	__le16			fes;
118*aa01c67dSCaleb Sander 	__le16			feil;
119*aa01c67dSCaleb Sander 	__le16			feiu;
120*aa01c67dSCaleb Sander 	__u8			rsvd[10];
121fc221d05SSagi Grimberg };
122fc221d05SSagi Grimberg 
123fc221d05SSagi Grimberg /**
124fc221d05SSagi Grimberg  * struct nvme_tcp_cmd_pdu - nvme tcp command capsule pdu
125fc221d05SSagi Grimberg  *
126fc221d05SSagi Grimberg  * @hdr:           pdu common header
127fc221d05SSagi Grimberg  * @cmd:           nvme command
128fc221d05SSagi Grimberg  */
129fc221d05SSagi Grimberg struct nvme_tcp_cmd_pdu {
130fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
131fc221d05SSagi Grimberg 	struct nvme_command	cmd;
132fc221d05SSagi Grimberg };
133fc221d05SSagi Grimberg 
134fc221d05SSagi Grimberg /**
135fc221d05SSagi Grimberg  * struct nvme_tcp_rsp_pdu - nvme tcp response capsule pdu
136fc221d05SSagi Grimberg  *
137fc221d05SSagi Grimberg  * @hdr:           pdu common header
138fc221d05SSagi Grimberg  * @hdr:           nvme-tcp generic header
139fc221d05SSagi Grimberg  * @cqe:           nvme completion queue entry
140fc221d05SSagi Grimberg  */
141fc221d05SSagi Grimberg struct nvme_tcp_rsp_pdu {
142fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
143fc221d05SSagi Grimberg 	struct nvme_completion	cqe;
144fc221d05SSagi Grimberg };
145fc221d05SSagi Grimberg 
146fc221d05SSagi Grimberg /**
147fc221d05SSagi Grimberg  * struct nvme_tcp_r2t_pdu - nvme tcp ready-to-transfer pdu
148fc221d05SSagi Grimberg  *
149fc221d05SSagi Grimberg  * @hdr:           pdu common header
150fc221d05SSagi Grimberg  * @command_id:    nvme command identifier which this relates to
151fc221d05SSagi Grimberg  * @ttag:          transfer tag (controller generated)
152fc221d05SSagi Grimberg  * @r2t_offset:    offset from the start of the command data
153fc221d05SSagi Grimberg  * @r2t_length:    length the host is allowed to send
154fc221d05SSagi Grimberg  */
155fc221d05SSagi Grimberg struct nvme_tcp_r2t_pdu {
156fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
157fc221d05SSagi Grimberg 	__u16			command_id;
158fc221d05SSagi Grimberg 	__u16			ttag;
159fc221d05SSagi Grimberg 	__le32			r2t_offset;
160fc221d05SSagi Grimberg 	__le32			r2t_length;
161fc221d05SSagi Grimberg 	__u8			rsvd[4];
162fc221d05SSagi Grimberg };
163fc221d05SSagi Grimberg 
164fc221d05SSagi Grimberg /**
165fc221d05SSagi Grimberg  * struct nvme_tcp_data_pdu - nvme tcp data pdu
166fc221d05SSagi Grimberg  *
167fc221d05SSagi Grimberg  * @hdr:           pdu common header
168fc221d05SSagi Grimberg  * @command_id:    nvme command identifier which this relates to
169fc221d05SSagi Grimberg  * @ttag:          transfer tag (controller generated)
170fc221d05SSagi Grimberg  * @data_offset:   offset from the start of the command data
171fc221d05SSagi Grimberg  * @data_length:   length of the data stream
172fc221d05SSagi Grimberg  */
173fc221d05SSagi Grimberg struct nvme_tcp_data_pdu {
174fc221d05SSagi Grimberg 	struct nvme_tcp_hdr	hdr;
175fc221d05SSagi Grimberg 	__u16			command_id;
176fc221d05SSagi Grimberg 	__u16			ttag;
177fc221d05SSagi Grimberg 	__le32			data_offset;
178fc221d05SSagi Grimberg 	__le32			data_length;
179fc221d05SSagi Grimberg 	__u8			rsvd[4];
180fc221d05SSagi Grimberg };
181fc221d05SSagi Grimberg 
182fc221d05SSagi Grimberg union nvme_tcp_pdu {
183fc221d05SSagi Grimberg 	struct nvme_tcp_icreq_pdu	icreq;
184fc221d05SSagi Grimberg 	struct nvme_tcp_icresp_pdu	icresp;
185fc221d05SSagi Grimberg 	struct nvme_tcp_cmd_pdu		cmd;
186fc221d05SSagi Grimberg 	struct nvme_tcp_rsp_pdu		rsp;
187fc221d05SSagi Grimberg 	struct nvme_tcp_r2t_pdu		r2t;
188fc221d05SSagi Grimberg 	struct nvme_tcp_data_pdu	data;
189fc221d05SSagi Grimberg };
190fc221d05SSagi Grimberg 
191fc221d05SSagi Grimberg #endif /* _LINUX_NVME_TCP_H */
192