aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/nvmf/nvmf.h
blob: d4e7b1511e9df61f400ab4510126b53c65a19580 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*-
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Copyright (c) 2022-2024 Chelsio Communications, Inc.
 * Written by: John Baldwin <jhb@FreeBSD.org>
 */

#ifndef __NVMF_H__
#define	__NVMF_H__

#include <sys/ioccom.h>
#ifndef _KERNEL
#include <stdbool.h>
#endif

/*
 * Default settings in Fabrics controllers.  These match values used by the
 * Linux target.
 */
#define	NVMF_MAX_IO_ENTRIES	(1024)
#define	NVMF_CC_EN_TIMEOUT	(15)	/* In 500ms units */

/* Allows for a 16k data buffer + SQE */
#define	NVMF_IOCCSZ		(sizeof(struct nvme_command) + 16 * 1024)
#define	NVMF_IORCSZ		(sizeof(struct nvme_completion))

#define	NVMF_NN			(1024)

/*
 * (data, size) is the userspace buffer for a packed nvlist.
 *
 * For requests that copyout an nvlist, len is the amount of data
 * copied out to *data.  If size is zero, no data is copied and len is
 * set to the required buffer size.
 */
struct nvmf_ioc_nv {
	void	*data;
	size_t	len;
	size_t	size;
};

/*
 * The fields in a qpair handoff nvlist are:
 *
 * Transport independent:
 *
 * bool		admin
 * bool		sq_flow_control
 * number	qsize
 * number	sqhd
 * number	sqtail			host only
 *
 * TCP transport:
 *
 * number	fd
 * number	rxpda
 * number	txpda
 * bool		header_digests
 * bool		data_digests
 * number	maxr2t
 * number	maxh2cdata
 * number	max_icd
 */

/*
 * The fields in the nvlist for NVMF_HANDOFF_HOST and
 * NVMF_RECONNECT_HOST are:
 *
 * number			trtype
 * number			kato	(optional)
 * qpair handoff nvlist		admin
 * qpair handoff nvlist array	io
 * binary			cdata	struct nvme_controller_data
 * NVMF_RECONNECT_PARAMS nvlist	rparams
 */

/*
 * The fields in the nvlist for NVMF_RECONNECT_PARAMS are:
 *
 * binary			dle	struct nvme_discovery_log_entry
 * string			hostnqn
 * number			num_io_queues
 * number			kato	(optional)
 * number			io_qsize
 * bool				sq_flow_control
 *
 * TCP transport:
 *
 * bool				header_digests
 * bool				data_digests
 */

/*
 * The fields in the nvlist for NVMF_CONNECTION_STATUS are:
 *
 * bool				connected
 * timespec nvlist		last_disconnect
 *  number			tv_sec
 *  number			tv_nsec
 */

/*
 * The fields in the nvlist for handing off a controller qpair are:
 *
 * number			trtype
 * qpair handoff nvlist		params
 * binary			cmd	struct nvmf_fabric_connect_cmd
 * binary			data	struct nvmf_fabric_connect_data
 */

/* Operations on /dev/nvmf */
#define	NVMF_HANDOFF_HOST	_IOW('n', 200, struct nvmf_ioc_nv)
#define	NVMF_DISCONNECT_HOST	_IOW('n', 201, const char *)
#define	NVMF_DISCONNECT_ALL	_IO('n', 202)

/* Operations on /dev/nvmeX */
#define	NVMF_RECONNECT_PARAMS	_IOWR('n', 203, struct nvmf_ioc_nv)
#define	NVMF_RECONNECT_HOST	_IOW('n', 204, struct nvmf_ioc_nv)
#define	NVMF_CONNECTION_STATUS	_IOWR('n', 205, struct nvmf_ioc_nv)

#endif /* !__NVMF_H__ */